cdk-nextjs 0.7.12 → 0.7.14

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.
Files changed (44) hide show
  1. package/.jsii +346 -100
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +208 -0
  4. package/README.md +115 -100
  5. package/docs/breaking-changes.md +4 -2
  6. package/docs/development-guide.md +10 -0
  7. package/docs/harness-coverage.md +16 -6
  8. package/docs/next-build-output-guide.md +1 -1
  9. package/lib/adapter/adapter.mjs +4 -1
  10. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
  11. package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
  12. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +27 -0
  13. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  14. package/lib/nextjs-api.d.ts +11 -0
  15. package/lib/nextjs-api.js +63 -9
  16. package/lib/nextjs-api.test.js +127 -1
  17. package/lib/nextjs-build/nextjs-build.js +1 -1
  18. package/lib/nextjs-cache.js +1 -1
  19. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  20. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  21. package/lib/nextjs-distribution.d.ts +92 -2
  22. package/lib/nextjs-distribution.js +223 -109
  23. package/lib/nextjs-distribution.test.js +492 -12
  24. package/lib/nextjs-post-deploy.js +1 -1
  25. package/lib/nextjs-static-assets.js +1 -1
  26. package/lib/nextjs-static-assets.test.js +19 -7
  27. package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
  28. package/lib/root-constructs/nextjs-base-construct.js +14 -2
  29. package/lib/root-constructs/nextjs-global-containers.d.ts +16 -1
  30. package/lib/root-constructs/nextjs-global-containers.js +5 -2
  31. package/lib/root-constructs/nextjs-global-functions.d.ts +16 -1
  32. package/lib/root-constructs/nextjs-global-functions.js +5 -2
  33. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  34. package/lib/root-constructs/nextjs-regional-functions.js +3 -2
  35. package/lib/runtime/lambda.mjs +4 -1
  36. package/lib/runtime/server.mjs +4 -1
  37. package/lib/utils/viewer-request-functions.d.ts +53 -0
  38. package/lib/utils/viewer-request-functions.js +172 -0
  39. package/lib/utils/viewer-request-functions.test.d.ts +1 -0
  40. package/lib/utils/viewer-request-functions.test.js +43 -0
  41. package/package.json +4 -1
  42. package/scripts/e2e-harness/README.md +10 -8
  43. package/scripts/e2e-harness/app.js +7 -2
  44. package/scripts/render-diagrams.mjs +121 -0
@@ -68,6 +68,132 @@ describe("NextjsApi", () => {
68
68
  "images/{key}",
69
69
  ]);
70
70
  });
71
+ describe("service workers", () => {
72
+ function createServiceWorkerApi(serviceWorkerAllowed) {
73
+ return new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
74
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
75
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
76
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
77
+ handler: "index.handler",
78
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
79
+ }),
80
+ publicDirEntries: [],
81
+ serviceWorkerAllowed,
82
+ });
83
+ }
84
+ it("sends Service-Worker-Allowed from a resource of their own", () => {
85
+ createServiceWorkerApi("/");
86
+ expect(s3IntegrationKeys().sort()).toEqual([
87
+ "_next/static/service-worker/{key}",
88
+ "_next/static/{key}",
89
+ ]);
90
+ const template = assertions_1.Template.fromStack(stack);
91
+ template.hasResourceProperties("AWS::ApiGateway::Method", {
92
+ Integration: {
93
+ Uri: {
94
+ "Fn::Join": assertions_1.Match.arrayWith([
95
+ assertions_1.Match.arrayWith([
96
+ assertions_1.Match.stringLikeRegexp("_next/static/service-worker/\\{key\\}"),
97
+ ]),
98
+ ]),
99
+ },
100
+ IntegrationResponses: assertions_1.Match.arrayWith(["200", "304"].map((StatusCode) => assertions_1.Match.objectLike({
101
+ StatusCode,
102
+ ResponseParameters: assertions_1.Match.objectLike({
103
+ "method.response.header.Service-Worker-Allowed": "'/'",
104
+ "method.response.header.Cache-Control": "integration.response.header.Cache-Control",
105
+ }),
106
+ }))),
107
+ },
108
+ MethodResponses: assertions_1.Match.arrayWith(["200", "304"].map((StatusCode) => assertions_1.Match.objectLike({
109
+ StatusCode,
110
+ ResponseParameters: assertions_1.Match.objectLike({
111
+ "method.response.header.Service-Worker-Allowed": true,
112
+ }),
113
+ }))),
114
+ });
115
+ // The rest of `_next/static` doesn't send it.
116
+ const others = Object.values(template.findResources("AWS::ApiGateway::Method")).filter((method) => JSON.stringify(method.Properties.Integration.Uri).includes("_next/static/{key}"));
117
+ expect(others).toHaveLength(1);
118
+ expect(JSON.stringify(others[0])).not.toContain("Service-Worker-Allowed");
119
+ });
120
+ it("keeps the header through overrides that replace the responses", () => {
121
+ // Both overrides replace their object whole. API Gateway rejects an
122
+ // integration response mapping a header the method response doesn't
123
+ // declare, so the two have to survive together.
124
+ new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
125
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
126
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
127
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
128
+ handler: "index.handler",
129
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
130
+ }),
131
+ publicDirEntries: [],
132
+ serviceWorkerAllowed: "/",
133
+ overrides: {
134
+ s3MethodOptions: {
135
+ requestParameters: { "method.request.path.proxy": true },
136
+ methodResponses: [{ statusCode: "200" }],
137
+ },
138
+ },
139
+ });
140
+ const methods = Object.values(assertions_1.Template.fromStack(stack).findResources("AWS::ApiGateway::Method")).filter((method) => JSON.stringify(method.Properties.Integration.Uri).includes("service-worker"));
141
+ expect(methods).toHaveLength(1);
142
+ expect(methods[0].Properties.MethodResponses).toEqual([
143
+ {
144
+ StatusCode: "200",
145
+ ResponseParameters: {
146
+ "method.response.header.Service-Worker-Allowed": true,
147
+ },
148
+ },
149
+ ]);
150
+ });
151
+ it("keeps the header through a staticIntegrationProps.options override", () => {
152
+ new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
153
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
154
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
155
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
156
+ handler: "index.handler",
157
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
158
+ }),
159
+ publicDirEntries: [],
160
+ serviceWorkerAllowed: "/",
161
+ overrides: {
162
+ staticIntegrationProps: {
163
+ service: "s3",
164
+ path: "my-bucket/_next/static/{key}",
165
+ options: {
166
+ requestParameters: {
167
+ "integration.request.path.key": "method.request.path.proxy",
168
+ },
169
+ integrationResponses: [
170
+ { statusCode: "200" },
171
+ { statusCode: "404", selectionPattern: "404" },
172
+ ],
173
+ },
174
+ },
175
+ },
176
+ });
177
+ const responses = Object.values(assertions_1.Template.fromStack(stack).findResources("AWS::ApiGateway::Method"))
178
+ .filter((method) => method.Properties.Integration.Type === "AWS")
179
+ .map((method) => method.Properties.Integration.IntegrationResponses);
180
+ // Every S3 method gets the override; the one that declares the header in
181
+ // its method response still maps it, and only on the 200.
182
+ expect(responses).toContainEqual([
183
+ {
184
+ StatusCode: "200",
185
+ ResponseParameters: {
186
+ "method.response.header.Service-Worker-Allowed": "'/'",
187
+ },
188
+ },
189
+ { StatusCode: "404", SelectionPattern: "404" },
190
+ ]);
191
+ });
192
+ it("adds no resource without service workers", () => {
193
+ createServiceWorkerApi();
194
+ expect(s3IntegrationKeys()).toEqual(["_next/static/{key}"]);
195
+ });
196
+ });
71
197
  it("prefixes every S3 integration key with the static assets key prefix", () => {
72
198
  createApi("branch-x");
73
199
  expect(s3IntegrationKeys().sort()).toEqual([
@@ -722,4 +848,4 @@ describe("NextjsApi redeploy after update", () => {
722
848
  });
723
849
  });
724
850
  });
725
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hcGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw2Q0FBeUM7QUFDekMsdURBQXNFO0FBQ3RFLCtFQUFpRTtBQUNqRSx1REFLZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCw2Q0FBeUQ7QUFFekQ7Ozs7R0FJRztBQUNILFNBQVMsT0FBTyxDQUNkLE1BTUc7SUFFSCxPQUFPO1FBQ0wsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSTtZQUNKLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQy9DLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDN0IsSUFBQSxpQ0FBZSxFQUFDLEtBQUssRUFBRTtZQUNyQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLO1lBQzNDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxPQUFPLEVBQUUsUUFBUTtTQUNsQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsSUFBSSxLQUFZLENBQUM7SUFFakIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FB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UUFDbEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV2RCxRQUFRLENBQUMsZUFBZSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtRQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDckIsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1NBQy9DLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixTQUFTLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRTtTQUMxRCxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7WUFDdEQsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLGtCQUFLLENBQUMsUUFBUSxFQUFFLEVBQUU7YUFDN0M7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2gsIFRlbXBsYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2Fzc2VydGlvbnNcIjtcbmltcG9ydCB7IENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIENvZGUsXG4gIEZ1bmN0aW9uIGFzIExhbWJkYUZ1bmN0aW9uLFxuICBJRnVuY3Rpb24sXG4gIFJ1bnRpbWUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBwYXRoUGF0dGVybnNGb3IgfSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTmV4dGpzQXBpLCBOZXh0anNBcGlQcm9wcyB9IGZyb20gXCIuL25leHRqcy1hcGlcIjtcblxuLyoqXG4gKiBgZnVuY3Rpb25Hcm91cHNgIGFuZCB0aGUgYGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgIHRoZSBidWlsZCB3b3VsZCByZWNvcmQgZm9yXG4gKiB0aGVtOiBgcm91dGVzYCBhcyByb3V0ZWQgKGFuIG9wdGlvbmFsIGNhdGNoLWFsbCdzIHBhcmVudCBsaXN0ZWQgYnkgaGFuZCksXG4gKiB3aXRoIGRhdGEtVVJMIGJlaGF2aW9ycyBmb3IgYSBncm91cCB0aGF0IG93bnMgYSBQYWdlcyBSb3V0ZXIgcGFnZS5cbiAqL1xuZnVuY3Rpb24gZ3JvdXBlZChcbiAgZ3JvdXBzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHJvdXRlczogc3RyaW5nW107XG4gICAgaGFzRGF0YVJvdXRlcz86IGJvb2xlYW47XG4gICAgdHJhaWxpbmdTbGFzaD86IGJvb2xlYW47XG4gICAgZnVuY3Rpb246IElGdW5jdGlvbjtcbiAgfVtdLFxuKTogUGljazxOZXh0anNBcGlQcm9wcywgXCJmdW5jdGlvbkdyb3Vwc1wiIHwgXCJmdW5jdGlvbkdyb3VwQmVoYXZpb3JzXCI+IHtcbiAgcmV0dXJuIHtcbiAgICBmdW5jdGlvbkdyb3VwczogZ3JvdXBzLm1hcCgoeyBuYW1lLCBmdW5jdGlvbjogZm4gfSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBmdW5jdGlvbjogZm4sXG4gICAgfSkpLFxuICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnM6IGdyb3Vwcy5mbGF0TWFwKChncm91cCkgPT5cbiAgICAgIGdyb3VwLnJvdXRlcy5mbGF0TWFwKChyb3V0ZSkgPT5cbiAgICAgICAgcGF0aFBhdHRlcm5zRm9yKHJvdXRlLCB7XG4gICAgICAgICAgaGFzRGF0YVJvdXRlczogZ3JvdXAuaGFzRGF0YVJvdXRlcyA/PyBmYWxzZSxcbiAgICAgICAgICB0cmFpbGluZ1NsYXNoOiBncm91cC50cmFpbGluZ1NsYXNoLFxuICAgICAgICAgIGJ1aWxkSWQ6IFwiYWJjMTIzXCIsXG4gICAgICAgIH0pLm1hcCgocGF0dGVybikgPT4gKHsgZ3JvdXA6IGdyb3VwLm5hbWUsIHJvdXRlLCBwYXR0ZXJuIH0pKSxcbiAgICAgICksXG4gICAgKSxcbiAgfTtcbn1cblxuZGVzY3JpYmUoXCJOZXh0anNBcGlcIiwgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJUZXN0U3RhY2tcIiwge1xuICAgICAgZW52OiB7IGFjY291bnQ6IFwiMTIzNDU2Nzg5MDEyXCIsIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIiB9LFxuICAgIH0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBjcmVhdGVBcGkoc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeCxcbiAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgfSksXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgIHsgbmFtZTogXCJmYXZpY29uLmljb1wiLCBpc0RpcmVjdG9yeTogZmFsc2UgfSxcbiAgICAgICAgeyBuYW1lOiBcImltYWdlc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUzMgaW50ZWdyYXRpb25zIGFkZHJlc3Mgb2JqZWN0cyBieSBrZXksIHNvIHRoZSB1cGxvYWRlZCBrZXkgcHJlZml4IGhhc1xuICAgKiB0byBhcHBlYXIgaW4gdGhlIGludGVncmF0aW9uIFVSSSBvciBldmVyeSBzdGF0aWMgcmVxdWVzdCA0MDRzLlxuICAgKi9cbiAgZnVuY3Rpb24gczNJbnRlZ3JhdGlvbktleXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG1ldGhvZHMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6TWV0aG9kXCIsXG4gICAgKTtcbiAgICBjb25zdCBtYXJrZXIgPSBcInMzOnBhdGgvbXktYnVja2V0L1wiO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGhvZHMpXG4gICAgICAuZmxhdE1hcCgobWV0aG9kKSA9PiBtZXRob2QuUHJvcGVydGllcy5JbnRlZ3JhdGlvbi5VcmlbXCJGbjo6Sm9pblwiXVsxXSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChwYXJ0OiB1bmtub3duKTogcGFydCBpcyBzdHJpbmcgPT5cbiAgICAgICAgICB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIiAmJiBwYXJ0LmluY2x1ZGVzKG1hcmtlciksXG4gICAgICApXG4gICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnNwbGl0KG1hcmtlcilbMV0pO1xuICB9XG5cbiAgaXQoXCJhZGRyZXNzZXMgb2JqZWN0cyBhdCB0aGUgYnVja2V0IHJvb3Qgd2hlbiBubyBrZXkgcHJlZml4IGlzIHNldFwiLCAoKSA9PiB7XG4gICAgY3JlYXRlQXBpKCk7XG5cbiAgICBleHBlY3QoczNJbnRlZ3JhdGlvbktleXMoKS5zb3J0KCkpLnRvRXF1YWwoW1xuICAgICAgXCJfbmV4dC9zdGF0aWMve2tleX1cIixcbiAgICAgIFwiZmF2aWNvbi5pY29cIixcbiAgICAgIFwiaW1hZ2VzL3trZXl9XCIsXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwicHJlZml4ZXMgZXZlcnkgUzMgaW50ZWdyYXRpb24ga2V5IHdpdGggdGhlIHN0YXRpYyBhc3NldHMga2V5IHByZWZpeFwiLCAoKSA9PiB7XG4gICAgY3JlYXRlQXBpKFwiYnJhbmNoLXhcIik7XG5cbiAgICBleHBlY3QoczNJbnRlZ3JhdGlvbktleXMoKS5zb3J0KCkpLnRvRXF1YWwoW1xuICAgICAgXCJicmFuY2gteC9fbmV4dC9zdGF0aWMve2tleX1cIixcbiAgICAgIFwiYnJhbmNoLXgvZmF2aWNvbi5pY29cIixcbiAgICAgIFwiYnJhbmNoLXgvaW1hZ2VzL3trZXl9XCIsXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwibm9ybWFsaXplcyBzdXJyb3VuZGluZyBzbGFzaGVzIG9uIHRoZSBrZXkgcHJlZml4XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoXCIvYnJhbmNoLXgvXCIpO1xuXG4gICAgZXhwZWN0KHMzSW50ZWdyYXRpb25LZXlzKCkpLnRvQ29udGFpbihcImJyYW5jaC14L19uZXh0L3N0YXRpYy97a2V5fVwiKTtcbiAgfSk7XG5cbiAgLyoqIFRoZSBzdGF0ZW1lbnRzIG9mIHRoZSBBUEkgR2F0ZXdheSDihpIgUzMgaW50ZWdyYXRpb24gcm9sZSdzIHBvbGljeS4gKi9cbiAgZnVuY3Rpb24gc3RhdGljSW50ZWdyYXRpb25TdGF0ZW1lbnRzKCkge1xuICAgIGNvbnN0IHBvbGljaWVzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OklBTTo6UG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBSb2xlczogW3sgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiU3RhdGljSW50ZWdyYXRpb25Sb2xlXCIpIH1dLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHBvbGljaWVzKS5mbGF0TWFwKFxuICAgICAgKHBvbGljeSkgPT4gcG9saWN5LlByb3BlcnRpZXMuUG9saWN5RG9jdW1lbnQuU3RhdGVtZW50LFxuICAgICk7XG4gIH1cblxuICBpdChcInNjb3BlcyB0aGUgUzMgaW50ZWdyYXRpb24gcm9sZSB0byB0aGUgc3RhdGljIGFzc2V0cyBrZXkgcHJlZml4XCIsICgpID0+IHtcbiAgICAvLyBBIHNoYXJlZCBidWNrZXQgaG9sZHMgb3RoZXIgYXBwcycgYXNzZXRzIHVuZGVyIHRoZWlyIG93biBwcmVmaXhlcy5cbiAgICBjcmVhdGVBcGkoXCIvYnJhbmNoLXgvXCIpO1xuXG4gICAgY29uc3QgYnVja2V0QXJuID0ge1xuICAgICAgXCJGbjo6Sm9pblwiOiBbXCJcIiwgW1wiYXJuOlwiLCB7IFJlZjogXCJBV1M6OlBhcnRpdGlvblwiIH0sIFwiOnMzOjo6bXktYnVja2V0XCJdXSxcbiAgICB9O1xuICAgIGV4cGVjdChzdGF0aWNJbnRlZ3JhdGlvblN0YXRlbWVudHMoKSkudG9FcXVhbChbXG4gICAgICB7XG4gICAgICAgIEFjdGlvbjogXCJzMzpHZXRPYmplY3RcIixcbiAgICAgICAgRWZmZWN0OiBcIkFsbG93XCIsXG4gICAgICAgIFJlc291cmNlOiB7XG4gICAgICAgICAgXCJGbjo6Sm9pblwiOiBbXG4gICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgW1wiYXJuOlwiLCB7IFJlZjogXCJBV1M6OlBhcnRpdGlvblwiIH0sIFwiOnMzOjo6bXktYnVja2V0L2JyYW5jaC14LypcIl0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFVuY29uZGl0aW9uZWQ6IFMzIGNoZWNrcyBpdCBkdXJpbmcgYSBHZXRPYmplY3QsIHdpdGggbm8gYHMzOnByZWZpeGAuXG4gICAgICAgIEFjdGlvbjogXCJzMzpMaXN0QnVja2V0XCIsXG4gICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICBSZXNvdXJjZTogYnVja2V0QXJuLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJsZXRzIHRoZSBTMyBpbnRlZ3JhdGlvbiByb2xlIHJlYWQgdGhlIHdob2xlIGJ1Y2tldCB3aXRob3V0IGEga2V5IHByZWZpeFwiLCAoKSA9PiB7XG4gICAgY3JlYXRlQXBpKCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gc3RhdGljSW50ZWdyYXRpb25TdGF0ZW1lbnRzKCk7XG4gICAgZXhwZWN0KHN0YXRlbWVudHMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBleHBlY3Qoc3RhdGVtZW50c1swXS5SZXNvdXJjZVtcIkZuOjpKb2luXCJdWzFdKS50b0NvbnRhaW4oXG4gICAgICBcIjpzMzo6Om15LWJ1Y2tldC8qXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUga2V5IHByZWZpeCBpbmRlcGVuZGVudCBvZiBiYXNlUGF0aCwgd2hpY2ggaXMgdGhlIFVSTCBwcmVmaXhcIiwgKCkgPT4ge1xuICAgIC8vIEEgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnMgYXBwIHdob3NlIGBiYXNlUGF0aGAgbWF0Y2hlcyB0aGUgQVBJIEdhdGV3YXlcbiAgICAvLyBzdGFnZSBzdGlsbCBoYXMgaXRzIGFzc2V0cyBhdCB0aGUgYnVja2V0IHJvb3QuXG4gICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgYmFzZVBhdGg6IFwiL3Byb2RcIixcbiAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgfSksXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpKS50b0VxdWFsKFtcIl9uZXh0L3N0YXRpYy97a2V5fVwiXSk7XG4gICAgLy8gLi4uc2VydmVkIHVuZGVyIHRoZSBzdGFnZS1tYXRjaGluZyBVUkwgcHJlZml4LlxuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc291cmNlXCIsXG4gICAgICB7IFBhdGhQYXJ0OiBcInByb2RcIiB9LFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIEFQSSBHYXRld2F5IHBhdGggcGFydHMgY2FuJ3QgY29udGFpbiBcIi9cIiwgc28gYSBuZXN0ZWQgYmFzZVBhdGggcGFzc2VkIHdob2xlXG4gIC8vIHRvIGBhZGRSZXNvdXJjZWAgZmFpbHMgQ0RLJ3MgYHZhbGlkYXRlUmVzb3VyY2VQYXRoUGFydGAgYXQgc3ludGguIEl0J3NcbiAgLy8gcmVhY2hhYmxlOiBgcmVzb2x2ZUJhc2VQYXRoYCBhY2NlcHRzIGEgbmVzdGVkIHByb3AgZm9yIFJFR0lPTkFMX0ZVTkNUSU9OUyBhc1xuICAvLyBsb25nIGFzIHRoZSBhcHAncyBiYXNlUGF0aCBlbmRzIHdpdGggaXQuXG4gIGRlc2NyaWJlKFwibmVzdGVkIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBmdW5jdGlvbiBwYXRoUGFydHMoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZXNvdXJjZXMpLm1hcChcbiAgICAgICAgKHJlc291cmNlKSA9PiByZXNvdXJjZS5Qcm9wZXJ0aWVzLlBhdGhQYXJ0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVBcGlXaXRoQmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZykge1xuICAgICAgcmV0dXJuIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KFwiY3JlYXRlcyBvbmUgcmVzb3VyY2UgcGVyIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IGNyZWF0ZUFwaVdpdGhCYXNlUGF0aChcIi90ZWFtL2FwcFwiKSkubm90LnRvVGhyb3coKTtcblxuICAgICAgZXhwZWN0KHBhdGhQYXJ0cygpKS50b0VxdWFsKFxuICAgICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcInRlYW1cIiwgXCJhcHBcIiwgXCJfbmV4dFwiLCBcIntwcm94eSt9XCJdKSxcbiAgICAgICk7XG4gICAgICAvLyBOb3QgdGhlIHVuc3BsaXQgdmFsdWUsIHdoaWNoIEFQSSBHYXRld2F5IHdvdWxkIHJlamVjdC5cbiAgICAgIGV4cGVjdChwYXRoUGFydHMoKSkubm90LnRvQ29udGFpbihcInRlYW0vYXBwXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJuZXN0cyB0aGUgc2VnbWVudHMgc28gdGhlIGFwcCBpcyByZWFjaGFibGUgdW5kZXIgdGhlIGZ1bGwgcGF0aFwiLCAoKSA9PiB7XG4gICAgICBjcmVhdGVBcGlXaXRoQmFzZVBhdGgoXCIvdGVhbS9hcHBcIik7XG5cbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc291cmNlXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgYnlQYXRoUGFydCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKS5tYXAoKFtsb2dpY2FsSWQsIHJlc291cmNlXSkgPT4gW1xuICAgICAgICAgIHJlc291cmNlLlByb3BlcnRpZXMuUGF0aFBhcnQsXG4gICAgICAgICAgeyBsb2dpY2FsSWQsIHBhcmVudElkOiByZXNvdXJjZS5Qcm9wZXJ0aWVzLlBhcmVudElkIH0sXG4gICAgICAgIF0pLFxuICAgICAgKTtcbiAgICAgIC8vIFwiYXBwXCIgaGFuZ3Mgb2ZmIFwidGVhbVwiLCBub3Qgb2ZmIHRoZSBBUEkgcm9vdC5cbiAgICAgIGV4cGVjdChieVBhdGhQYXJ0LmFwcC5wYXJlbnRJZCkudG9FcXVhbCh7XG4gICAgICAgIFJlZjogYnlQYXRoUGFydC50ZWFtLmxvZ2ljYWxJZCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGJ5UGF0aFBhcnQudGVhbS5wYXJlbnRJZCkudG9IYXZlUHJvcGVydHkoXCJGbjo6R2V0QXR0XCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdGlsbCBjcmVhdGVzIGEgc2luZ2xlIHJlc291cmNlIGZvciBhIGZsYXQgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgY3JlYXRlQXBpV2l0aEJhc2VQYXRoKFwiL2Jhc2VcIik7XG5cbiAgICAgIGV4cGVjdChwYXRoUGFydHMoKSkudG9Db250YWluKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ1cmxcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoXG4gICAgICBwcm9wczogUGFydGlhbDxOZXh0anNBcGlQcm9wcz4gPSB7fSxcbiAgICApOiBOZXh0anNBcGkge1xuICAgICAgcmV0dXJuIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvbWFpbk5hbWUoYmFzZVBhdGg/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbk5hbWU6IFwiYXBwLmV4YW1wbGUuY29tXCIsXG4gICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgXCJDZXJ0XCIsXG4gICAgICAgICAgXCJhcm46YXdzOmFjbTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNlcnRpZmljYXRlL2FiY1wiLFxuICAgICAgICApLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFJFU1QgQVBJIGlkLCB0aGUgc3RhZ2UgbmFtZSBhbmQgdGhlIGRvbWFpbiBuYW1lIGFyZSBhbGwgdG9rZW5zIHRoYXRcbiAgICAgKiBvbmx5IHJlc29sdmUgYXQgZGVwbG95IHRpbWUsIHNvIGZsYXR0ZW4gdGhlIHJlc29sdmVkIGBGbjo6Sm9pbmAgYW5kIHN0YW5kXG4gICAgICogZWFjaCByZWZlcmVuY2UgaW4gZm9yIHRoZSByZXNvdXJjZSBpdCBwb2ludHMgYXQgKG1pbnVzIENESydzIGxvZ2ljYWwgaWRcbiAgICAgKiBoYXNoIHN1ZmZpeCkuIFRoYXQga2VlcHMgdGhlIGFzc2VydGlvbnMgYWJvdXQgKndoaWNoKiByZXNvdXJjZSBzdXBwbGllc1xuICAgICAqIGVhY2ggcGFydCBvZiB0aGUgVVJMLCB3aGljaCBpcyB0aGUgd2hvbGUgcXVlc3Rpb24gaGVyZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVXJsKGFwaTogTmV4dGpzQXBpKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gc3RhY2sucmVzb2x2ZShhcGkudXJsKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkW1wiRm46OkpvaW5cIl1bMV1cbiAgICAgICAgLm1hcCgocGFydDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBwYXJ0XG4gICAgICAgICAgICA6IGB7JHsocGFydCBhcyB7IFJlZjogc3RyaW5nIH0pLlJlZi5yZXBsYWNlKC9bMC05QS1GXXs4fSQvLCBcIlwiKX19YCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBpdChcInJlcG9ydHMgdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50IHdpdGggdGhlIHN0YWdlIGFwcGVuZGVkIHdoZW4gdGhlcmUncyBubyBjdXN0b20gZG9tYWluXCIsICgpID0+IHtcbiAgICAgIC8vIFRoZSBzdGFnZSBpcyBpbiB0aGUgcGF0aCBvbmx5IGhlcmUsIHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhlXG4gICAgICAvLyByZWdpb25hbC1mdW5jdGlvbnMgZXhhbXBsZSBzZXRzIGFuIGFwcCBiYXNlUGF0aCBvZiBcIi9wcm9kXCIuXG4gICAgICBleHBlY3QocmVzb2x2ZVVybChjcmVhdGVBcGlXaXRoT3ZlcnJpZGVzKCkpKS50b0JlKFxuICAgICAgICBcImh0dHBzOi8ve05leHRqc0FwaVJlc3RBcGl9LmV4ZWN1dGUtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3tOZXh0anNBcGlSZXN0QXBpRGVwbG95bWVudFN0YWdlcHJvZH1cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGVuZHMgYmFzZVBhdGgsIHdoaWNoIG5lc3RzIGV2ZXJ5IHJlc291cmNlIGEgbGV2ZWwgZG93blwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVVcmwoY3JlYXRlQXBpV2l0aE92ZXJyaWRlcyh7IGJhc2VQYXRoOiBcIi9teS1iYXNlLXBhdGhcIiB9KSksXG4gICAgICApLnRvQmUoXG4gICAgICAgIFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaX0uZXhlY3V0ZS1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20ve05leHRqc0FwaVJlc3RBcGlEZXBsb3ltZW50U3RhZ2Vwcm9kfS9teS1iYXNlLXBhdGhcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInByZWZlcnMgYSBjdXN0b20gZG9tYWluIGFuZCBkcm9wcyB0aGUgc3RhZ2UgZnJvbSB0aGUgcGF0aFwiLCAoKSA9PiB7XG4gICAgICAvLyBBIGRvbWFpbiBtYXBwZWQgYXQgdGhlIHJvb3QgaXMgdGhlIGNsZWFuZXN0IFJlZ2lvbmFsIHNldHVwOiBubyBzdGFnZSBpblxuICAgICAgLy8gdGhlIFVSTCBtZWFucyBubyBiYXNlUGF0aCBhbmQgbm8gc3RhZ2Ugd29ya2Fyb3VuZHMgYW55d2hlcmUuIFRoZSBzdGFnZSBpc1xuICAgICAgLy8gcmVhY2hlZCB0aHJvdWdoIHRoZSBkb21haW4ncyBiYXNlIHBhdGggbWFwcGluZyBpbnN0ZWFkLlxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlVXJsKFxuICAgICAgICAgIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoe1xuICAgICAgICAgICAgb3ZlcnJpZGVzOiB7IHJlc3RBcGlQcm9wczogeyBkb21haW5OYW1lOiBkb21haW5OYW1lKCkgfSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaUN1c3RvbURvbWFpbn1cIik7XG4gICAgfSk7XG5cbiAgICBpdChcImluY2x1ZGVzIGEgY3VzdG9tIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nXCIsICgpID0+IHtcbiAgICAgIC8vIENESyByZWplY3RzIHN1cnJvdW5kaW5nIHNsYXNoZXMgb24gYSBtYXBwaW5nLCBzbyBpdCdzIGFsd2F5cyBhIGJhcmVcbiAgICAgIC8vIHNlZ21lbnQgYnkgdGhlIHRpbWUgaXQgZ2V0cyBoZXJlLlxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlVXJsKFxuICAgICAgICAgIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoe1xuICAgICAgICAgICAgb3ZlcnJpZGVzOiB7IHJlc3RBcGlQcm9wczogeyBkb21haW5OYW1lOiBkb21haW5OYW1lKFwidGVhbS1hXCIpIH0gfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICkudG9CZShcImh0dHBzOi8ve05leHRqc0FwaVJlc3RBcGlDdXN0b21Eb21haW59L3RlYW0tYVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJmdW5jdGlvbkdyb3VwcyByZXNvdXJjZSB0cmVlXCIsICgpID0+IHtcbiAgICAvKiogTGFtYmRhIGZ1bmN0aW9ucyB0aGF0IGBBTllgIG9uIHRoZSByZXNvdXJjZSBhdCBgcGF0aFBhcnRgIGludm9rZXMuICovXG4gICAgZnVuY3Rpb24gYW55VGFyZ2V0cyhwYXRoUGFydDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcyhcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIiwge1xuICAgICAgICBQcm9wZXJ0aWVzOiB7IFBhdGhQYXJ0OiBwYXRoUGFydCB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhyZXNvdXJjZXMpO1xuICAgICAgZXhwZWN0KGlkcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgY29uc3QgbWV0aG9kcyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZFwiLCB7XG4gICAgICAgIFByb3BlcnRpZXM6IHsgSHR0cE1ldGhvZDogXCJBTllcIiwgUmVzb3VyY2VJZDogeyBSZWY6IGlkc1swXSB9IH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGhvZHMpLm1hcChcbiAgICAgICAgKG1ldGhvZCkgPT5cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtZXRob2QuUHJvcGVydGllcy5JbnRlZ3JhdGlvbi5VcmkpLm1hdGNoKFxuICAgICAgICAgICAgLyhTZXJ2ZXJGbnxHcm91cEZufFJlcG9ydHNGbilbQS1GMC05XSsvLFxuICAgICAgICAgICkhWzFdLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpdChcInNlbmRzIGEgZ3JvdXAncyBwYXJlbnQgcGF0aHMgdG8gdGhlIGRlZmF1bHQgZnVuY3Rpb25cIiwgKCkgPT4ge1xuICAgICAgLy8gQVBJIEdhdGV3YXkgYW5zd2VycyBhIG1ldGhvZGxlc3MgcmVzb3VyY2Ugd2l0aCA0MDMgcmF0aGVyIHRoYW4gZmFsbGluZ1xuICAgICAgLy8gYmFjayB0byB0aGUgcm9vdCBge3Byb3h5K31gLCBzbyBgL2FwaWAgYW5kIGAvYXBpL3JlcG9ydHNgIG5lZWQgb25lLlxuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicmVwb3J0c1wiLFxuICAgICAgICAgICAgcm91dGVzOiBbXCIvYXBpL3JlcG9ydHMvKipcIiwgXCIvYXBpL2V4cG9ydFwiXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiR3JvdXBGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoYW55VGFyZ2V0cyhcImFwaVwiKSkudG9FcXVhbChbXCJTZXJ2ZXJGblwiXSk7XG4gICAgICBleHBlY3QoYW55VGFyZ2V0cyhcInJlcG9ydHNcIikpLnRvRXF1YWwoW1wiU2VydmVyRm5cIl0pO1xuICAgICAgZXhwZWN0KGFueVRhcmdldHMoXCJleHBvcnRcIikpLnRvRXF1YWwoW1wiR3JvdXBGblwiXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNlbmRzIGEgcGFyZW50IHVuZGVyIGFub3RoZXIgZ3JvdXAncyBzdWJ0cmVlIHRvIHRoYXQgZ3JvdXBcIiwgKCkgPT4ge1xuICAgICAgLy8gYGFzc2lnblJvdXRlc1RvR3JvdXBzYCBwYWNrYWdlcyBgL2FwaS9yZXBvcnRzYCBpbnRvIGBhcGlgLCBhbmRcbiAgICAgIC8vIENsb3VkRnJvbnQncyBgYXBpLypgIHNlbmRzIGl0IHRoZXJlOyBzbyBtdXN0IEFQSSBHYXRld2F5LlxuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiYXBpXCIsXG4gICAgICAgICAgICByb3V0ZXM6IFtcIi9hcGkvKipcIl0sXG4gICAgICAgICAgICBoYXNEYXRhUm91dGVzOiB0cnVlLFxuICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJyZXBvcnRzXCIsXG4gICAgICAgICAgICByb3V0ZXM6IFtcIi9hcGkvcmVwb3J0cy9xMS8qKlwiXSxcbiAgICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IHRydWUsXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlJlcG9ydHNGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFYWNoIHBhdGggcGFydCBiZWxvdyBhcHBlYXJzIHR3aWNlLCB1bmRlciBgL2AgYW5kIHVuZGVyIHRoZSBkYXRhXG4gICAgICAvLyBwcmVmaXgsIHNvIGNoZWNrIHRoZSB0cmVlIGJ5IHBhdGguXG4gICAgICBjb25zdCB0YXJnZXRzID0gYW55VGFyZ2V0c0J5UGF0aCgpO1xuICAgICAgZXhwZWN0KHRhcmdldHNbXCIvYXBpXCJdKS50b0VxdWFsKFtcIlNlcnZlckZuXCJdKTtcbiAgICAgIGV4cGVjdCh0YXJnZXRzW1wiL2FwaS9yZXBvcnRzXCJdKS50b0VxdWFsKFtcIkdyb3VwRm5cIl0pO1xuICAgICAgZXhwZWN0KHRhcmdldHNbXCIvYXBpL3JlcG9ydHMvcTFcIl0pLnRvRXF1YWwoW1wiR3JvdXBGblwiXSk7XG4gICAgICBleHBlY3QodGFyZ2V0c1tcIi9hcGkvcmVwb3J0cy9xMS97cHJveHkrfVwiXSkudG9FcXVhbChbXCJSZXBvcnRzRm5cIl0pO1xuICAgICAgZXhwZWN0KHRhcmdldHNbXCIvX25leHQvZGF0YS97YnVpbGRJZH0vYXBpL3JlcG9ydHNcIl0pLnRvRXF1YWwoW1wiR3JvdXBGblwiXSk7XG4gICAgICBleHBlY3QodGFyZ2V0c1tcIi9fbmV4dC9kYXRhL3tidWlsZElkfVwiXSkudG9FcXVhbChbXCJTZXJ2ZXJGblwiXSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVHcm91cGVkQXBpKGhhc0RhdGFSb3V0ZXM6IGJvb2xlYW4pIHtcbiAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInJlcG9ydHNcIixcbiAgICAgICAgICAgIHJvdXRlczogW1wiL3JlcG9ydHMvKipcIiwgXCIvZG9jcy9pbnRyb1wiXSxcbiAgICAgICAgICAgIGhhc0RhdGFSb3V0ZXMsXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgcmVzb3VyY2UgcGF0aCBpbiB0aGUgQVBJLCBlLmcuIGAvX25leHQvZGF0YS97YnVpbGRJZH0veC5qc29uYC4gKi9cbiAgICBmdW5jdGlvbiByZXNvdXJjZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc291cmNlXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgcGF0aE9mID0gKGlkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCB7IFBhcmVudElkLCBQYXRoUGFydCB9ID0gcmVzb3VyY2VzW2lkXS5Qcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBQYXJlbnRJZC5SZWY7XG4gICAgICAgIHJldHVybiBwYXJlbnQgJiYgcmVzb3VyY2VzW3BhcmVudF1cbiAgICAgICAgICA/IGAke3BhdGhPZihwYXJlbnQpfS8ke1BhdGhQYXJ0fWBcbiAgICAgICAgICA6IGAvJHtQYXRoUGFydH1gO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpLm1hcChwYXRoT2YpLnNvcnQoKTtcbiAgICB9XG5cbiAgICAvKiogUmVzb3VyY2UgcGF0aCDihpIgdGhlIExhbWJkYSBmdW5jdGlvbnMgYEFOWWAgb24gaXQgaW52b2tlcy4gKi9cbiAgICBmdW5jdGlvbiBhbnlUYXJnZXRzQnlQYXRoKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpBcGlHYXRld2F5OjpSZXNvdXJjZVwiKTtcbiAgICAgIGNvbnN0IHBhdGhPZiA9IChpZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgeyBQYXJlbnRJZCwgUGF0aFBhcnQgfSA9IHJlc291cmNlc1tpZF0uUHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcGFyZW50ID0gUGFyZW50SWQuUmVmO1xuICAgICAgICByZXR1cm4gcGFyZW50ICYmIHJlc291cmNlc1twYXJlbnRdXG4gICAgICAgICAgPyBgJHtwYXRoT2YocGFyZW50KX0vJHtQYXRoUGFydH1gXG4gICAgICAgICAgOiBgLyR7UGF0aFBhcnR9YDtcbiAgICAgIH07XG4gICAgICBjb25zdCBtZXRob2RzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcyhcIkFXUzo6QXBpR2F0ZXdheTo6TWV0aG9kXCIsIHtcbiAgICAgICAgUHJvcGVydGllczogeyBIdHRwTWV0aG9kOiBcIkFOWVwiIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgT2JqZWN0LnZhbHVlcyhtZXRob2RzKSkge1xuICAgICAgICBjb25zdCBpZCA9IG1ldGhvZC5Qcm9wZXJ0aWVzLlJlc291cmNlSWQ/LlJlZjtcbiAgICAgICAgaWYgKCFpZCB8fCAhcmVzb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICh0YXJnZXRzW3BhdGhPZihpZCldID8/PSBbXSkucHVzaChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShtZXRob2QuUHJvcGVydGllcy5JbnRlZ3JhdGlvbi5VcmkpLm1hdGNoKFxuICAgICAgICAgICAgLyhTZXJ2ZXJGbnxHcm91cEZufFJlcG9ydHNGbilbQS1GMC05XSsvLFxuICAgICAgICAgICkhWzFdLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldHM7XG4gICAgfVxuXG4gICAgaXQoXCJyb3V0ZXMgYSBncm91cCdzIFBhZ2VzIFJvdXRlciBkYXRhIFVSTHMgdG8gaXQgdG9vXCIsICgpID0+IHtcbiAgICAgIGNyZWF0ZUdyb3VwZWRBcGkodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHBhdGhzID0gcmVzb3VyY2VQYXRocygpO1xuICAgICAgZXhwZWN0KHBhdGhzKS50b0NvbnRhaW4oXCIvX25leHQvZGF0YS97YnVpbGRJZH0vcmVwb3J0cy97cHJveHkrfVwiKTtcbiAgICAgIGV4cGVjdChwYXRocykudG9Db250YWluKFwiL19uZXh0L2RhdGEve2J1aWxkSWR9L2RvY3MvaW50cm8uanNvblwiKTtcbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzKFwiaW50cm8uanNvblwiKSkudG9FcXVhbChbXCJHcm91cEZuXCJdKTtcbiAgICAgIC8vIEEgbWV0aG9kbGVzcyBwYXJlbnQgYW5zd2VycyA0MDMsIHNvIHRoZSBkYXRhIHByZWZpeCBuZWVkcyB0aGUgZGVmYXVsdC5cbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzKFwie2J1aWxkSWR9XCIpKS50b0VxdWFsKFtcIlNlcnZlckZuXCJdKTtcbiAgICB9KTtcblxuICAgIGl0KFwia2VlcHMgZWFjaCBncm91cCdzIGRhdGEgVVJMcyB0byBpdHMgb3duIHN1YnRyZWUgKEEpXCIsICgpID0+IHtcbiAgICAgIC8vIGB7YnVpbGRJZH1gIGlzIG9uZSBwYXRoIHNlZ21lbnQsIHdoZXJlIENsb3VkRnJvbnQncyBgKmAgY3Jvc3NlZCBgL2A6XG4gICAgICAvLyBgL19uZXh0L2RhdGEvPGlkPi9kb2NzL2Jsb2cveC5qc29uYCBoYXMgbm8gd2F5IGludG8gYmxvZydzIHJlc291cmNlLlxuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiYmxvZ1wiLFxuICAgICAgICAgICAgcm91dGVzOiBbXCIvYmxvZy8qKlwiXSxcbiAgICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IHRydWUsXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb3VyY2VQYXRocygpLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGFcIikpLFxuICAgICAgKS50b0VxdWFsKFtcbiAgICAgICAgXCIvX25leHQvZGF0YVwiLFxuICAgICAgICBcIi9fbmV4dC9kYXRhL3tidWlsZElkfVwiLFxuICAgICAgICBcIi9fbmV4dC9kYXRhL3tidWlsZElkfS9ibG9nXCIsXG4gICAgICAgIFwiL19uZXh0L2RhdGEve2J1aWxkSWR9L2Jsb2cve3Byb3h5K31cIixcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyb3V0ZXMgYW4gb3B0aW9uYWwgY2F0Y2gtYWxsJ3MgcGFyZW50IHRvIHRoZSBncm91cCB3aGVuIGl0IGlzIGxpc3RlZCAoQilcIiwgKCkgPT4ge1xuICAgICAgLy8gVGhlIGJ1aWxkIHJvdXRlcyBgL3Nob3BgIGFsb25nc2lkZSBgL3Nob3AvKipgIHdoZW4gdGhlIGdyb3VwIG93bnNcbiAgICAgIC8vIGBzaG9wL1tbLi4uc2x1Z11dYCAoc2VlIGByb3V0ZWRQYXR0ZXJuc2ApOiBge3Byb3h5K31gIGRvZXMgbm90IG1hdGNoXG4gICAgICAvLyB0aGUgcGFyZW50LCB3aGljaCB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhlIGRlZmF1bHQgZnVuY3Rpb24uXG4gICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgLi4uZ3JvdXBlZChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG9wXCIsXG4gICAgICAgICAgICByb3V0ZXM6IFtcIi9zaG9wLyoqXCIsIFwiL3Nob3BcIl0sXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzKFwic2hvcFwiKSkudG9FcXVhbChbXCJHcm91cEZuXCJdKTtcbiAgICB9KTtcblxuICAgIGl0LmVhY2goW1xuICAgICAgW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sIFwiL2RvY3MvKipcIiwgXCJkaXJlY3RvcnlcIl0sXG4gICAgICBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfSwgXCIvZG9jcy9ndWlkZS8qKlwiLCBcImRpcmVjdG9yeVwiXSxcbiAgICAgIFt7IG5hbWU6IFwicm9ib3RzLnR4dFwiLCBpc0RpcmVjdG9yeTogZmFsc2UgfSwgXCIvcm9ib3RzLnR4dFwiLCBcImZpbGVcIl0sXG4gICAgXSkoXG4gICAgICBcInJlamVjdHMgYSBncm91cCByb3V0ZSBvbiBhIHB1YmxpYy8gZW50cnkncyByZXNvdXJjZTogJXAgd2l0aCAlcCAoRSlcIixcbiAgICAgIChlbnRyeSwgcm91dGUsIGtpbmQpID0+IHtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgICAgIFwiQnVja2V0XCIsXG4gICAgICAgICAgICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbZW50cnldLFxuICAgICAgICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcImdcIixcbiAgICAgICAgICAgICAgICAgIHJvdXRlczogW3JvdXRlXSxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiR3JvdXBGblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApLnRvVGhyb3coYG92ZXJsYXBzIHRoZSB0b3AtbGV2ZWwgcHVibGljLyAke2tpbmR9IFwiJHtlbnRyeS5uYW1lfVwiYCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpdChcImFsbG93cyBhbiBleGFjdCByb3V0ZSBuYW1lZCBsaWtlIGEgcHVibGljLyBkaXJlY3RvcnksIHdoaWNoIGlzIG5vdCB1bmRlciBpdFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgICBcIkJ1Y2tldFwiLFxuICAgICAgICAgICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiZ1wiLFxuICAgICAgICAgICAgICAgIHJvdXRlczogW1wiL2RvY3NcIl0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgIH0pLFxuICAgICAgKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyb3V0ZXMgYW4gZXhhY3Qgcm91dGUncyB0cmFpbGluZ1NsYXNoIGZvcm0gdGhyb3VnaCBpdHMgb25lIHJlc291cmNlXCIsICgpID0+IHtcbiAgICAgIC8vIENsb3VkRnJvbnQgbmVlZHMgYHByaWNpbmcvYCBhcyBhIGJlaGF2aW9yIG9mIGl0cyBvd247IEFQSSBHYXRld2F5XG4gICAgICAvLyBtYXRjaGVzIGAvcHJpY2luZy9gIG9uIHRoZSBgcHJpY2luZ2AgcmVzb3VyY2UsIHNvIHRoZSB2YXJpYW50IGFkZHNcbiAgICAgIC8vIG5vdGhpbmcgaGVyZSBhbmQgbXVzdCBub3QgYWRkIHRoZSByZXNvdXJjZSB0d2ljZS5cbiAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInByaWNpbmdcIixcbiAgICAgICAgICAgIHJvdXRlczogW1wiL3ByaWNpbmdcIl0sXG4gICAgICAgICAgICB0cmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc291cmNlUGF0aHMoKS5maWx0ZXIoKHBhdGgpID0+ICFwYXRoLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljXCIpKSxcbiAgICAgICkudG9FcXVhbChbXCIvX25leHRcIiwgXCIvcHJpY2luZ1wiLCBcIi97cHJveHkrfVwiXSk7XG4gICAgICBleHBlY3QoYW55VGFyZ2V0c0J5UGF0aCgpKS50b0VxdWFsKHtcbiAgICAgICAgXCIvcHJpY2luZ1wiOiBbXCJHcm91cEZuXCJdLFxuICAgICAgICBcIi97cHJveHkrfVwiOiBbXCJTZXJ2ZXJGblwiXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIGEgYmVoYXZpb3IgZm9yIGEgZ3JvdXAgaXQgd2FzIG5vdCBnaXZlblwiLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMgfSA9IGdyb3VwZWQoW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJhcGlcIixcbiAgICAgICAgICByb3V0ZXM6IFtcIi9hcGkvKipcIl0sXG4gICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgICAgXCJCdWNrZXRcIixcbiAgICAgICAgICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIH0pLFxuICAgICAgKS50b1Rocm93KC9yb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgXCJhcGlcIiwgd2hpY2ggaXMgbm90IGluLyk7XG4gICAgfSk7XG5cbiAgICBpdChcImFkZHMgbm8gZGF0YSByb3V0ZXMgZm9yIGFuIGFwcCB3aXRob3V0IFBhZ2VzIFJvdXRlciByb3V0ZXNcIiwgKCkgPT4ge1xuICAgICAgY3JlYXRlR3JvdXBlZEFwaShmYWxzZSk7XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb3VyY2VQYXRocygpLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGFcIikpLFxuICAgICAgKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZ3JhbnRzIGVhY2ggZnVuY3Rpb24gb25lIEFQSS1zY29wZWQgcGVybWlzc2lvbiwgbm90IHR3byBwZXIgbWV0aG9kXCIsICgpID0+IHtcbiAgICAgIC8vIFBlci1tZXRob2QgcGVybWlzc2lvbnMgcHV0IHR3byBzdGF0ZW1lbnRzIGluIHRoZSBmdW5jdGlvbidzIHJlc291cmNlXG4gICAgICAvLyBwb2xpY3kgZm9yIGV2ZXJ5IGBBTllgLCB3aGljaCBvdXRncm93cyBMYW1iZGEncyAyMCBLQiBjYXAuXG4gICAgICBjcmVhdGVHcm91cGVkQXBpKHRydWUpO1xuXG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6TGFtYmRhOjpQZXJtaXNzaW9uXCIsIHtcbiAgICAgICAgICBQcm9wZXJ0aWVzOiB7IFByaW5jaXBhbDogXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBleHBlY3QocGVybWlzc2lvbnMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICBjb25zdCBzb3VyY2VBcm4gPSBKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9uLlByb3BlcnRpZXMuU291cmNlQXJuKTtcbiAgICAgICAgZXhwZWN0KHNvdXJjZUFybikudG9Db250YWluKFwiOmV4ZWN1dGUtYXBpOlwiKTtcbiAgICAgICAgZXhwZWN0KHNvdXJjZUFybikudG9Db250YWluKFwiLyovKi8qXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpdChcIm5hbWVzIHRoZSBncm91cCBhbmQgcGF0dGVybiBBUEkgR2F0ZXdheSBjYW5ub3Qgcm91dGVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgXCJCdWNrZXRcIixcbiAgICAgICAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJhYm91dFwiLFxuICAgICAgICAgICAgICByb3V0ZXM6IFtcIi9hYm91dH51c1wiXSxcbiAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coL3BhdHRlcm4gXCJcXC9hYm91dH51c1wiIFxcKGdyb3VwIFwiYWJvdXRcIlxcKSBoYXMgYSBzZWdtZW50Lyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiYSBwdWJsaWMvIGVudHJ5IEFQSSBHYXRld2F5IGNhbm5vdCBhZGRyZXNzXCIsICgpID0+IHtcbiAgICBpdChcIndhcm5zIGFuZCBza2lwcyBpdCBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHN5bnRoXCIsICgpID0+IHtcbiAgICAgIC8vIGBwdWJsaWMvaGVsbG8gd29ybGQuanBnYCBpcyBhIHZhbGlkIE5leHQuanMgYXNzZXQgdGhhdCBgYWRkUmVzb3VyY2VgXG4gICAgICAvLyByZWplY3RzIG91dHJpZ2h0LCB0YWtpbmcgdGhlIHdob2xlIGFwcCdzIHN5bnRoIHdpdGggaXQuIFRoZSBHbG9iYWwgdHlwZXNcbiAgICAgIC8vIHNlcnZlIGl0IHdpdGggYSB3aWxkY2FyZCBwYXRoIHBhdHRlcm47IGhlcmUgdGhlIGhvbmVzdCBvdXRjb21lIGlzIG9uZVxuICAgICAgLy8gNDA0aW5nIGFzc2V0IGFuZCBhIHdhcm5pbmcgdGhhdCBuYW1lcyBpdC5cbiAgICAgIGNvbnN0IGFwaSA9IG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwiaGVsbG8gd29ybGQuanBnXCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCLDpMO2w7zFocSNxZnDrS5wbmdcIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImZhdmljb24uaWNvXCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spXG4gICAgICAgIC5maW5kV2FybmluZyhgLyR7YXBpLm5vZGUucGF0aH1gLCBNYXRjaC5hbnlWYWx1ZSgpKVxuICAgICAgICAubWFwKCh3YXJuaW5nKSA9PiB3YXJuaW5nLmVudHJ5LmRhdGEgYXMgc3RyaW5nKVxuICAgICAgICAuam9pbihcIlxcblwiKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS50b0NvbnRhaW4oJ1wiaGVsbG8gd29ybGQuanBnXCInKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS50b0NvbnRhaW4oJ1wiw6TDtsO8xaHEjcWZw60ucG5nXCInKTtcbiAgICAgIGV4cGVjdChtZXNzYWdlKS5ub3QudG9Db250YWluKCdcImZhdmljb24uaWNvXCInKTtcbiAgICAgIC8vIFRoZSBleHByZXNzaWJsZSBvbmUgaXMgc3RpbGwgc2VydmVkLlxuICAgICAgZXhwZWN0KHMzSW50ZWdyYXRpb25LZXlzKCkpLnRvQ29udGFpbihcImZhdmljb24uaWNvXCIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIk5leHRqc0FwaSByZWRlcGxveSBhZnRlciB1cGRhdGVcIiwgKCkgPT4ge1xuICBmdW5jdGlvbiBzeW50aChwcm9wczogUGFydGlhbDxOZXh0anNBcGlQcm9wcz4gPSB7fSkge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJUZXN0U3RhY2tcIiwge1xuICAgICAgZW52OiB7IGFjY291bnQ6IFwiMTIzNDU2Nzg5MDEyXCIsIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIiB9LFxuICAgIH0pO1xuICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgfSksXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICAgIHJldHVybiBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB9XG5cbiAgLyoqIFRoZSBgRm46OkpvaW5gIHBhcnRzIG9mIGV2ZXJ5IHJlc291cmNlIHRoZSByZWRlcGxveSByb2xlIGlzIGdyYW50ZWQuICovXG4gIGZ1bmN0aW9uIGdyYW50ZWRSZXNvdXJjZXModGVtcGxhdGU6IFRlbXBsYXRlKSB7XG4gICAgY29uc3QgW3BvbGljeV0gPSBPYmplY3QudmFsdWVzKFxuICAgICAgdGVtcGxhdGUuZmluZFJlc291cmNlcyhcIkFXUzo6SUFNOjpQb2xpY3lcIiwge1xuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgUG9saWN5TmFtZTogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIlJlZGVwbG95Rm5cIiksXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBwb2xpY3kuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQubWFwKFxuICAgICAgKHN0YXRlbWVudDogeyBBY3Rpb246IHN0cmluZzsgUmVzb3VyY2U6IHVua25vd24gfSkgPT4gKHtcbiAgICAgICAgYWN0aW9uOiBzdGF0ZW1lbnQuQWN0aW9uLFxuICAgICAgICByZXNvdXJjZXM6IEpTT04uc3RyaW5naWZ5KHN0YXRlbWVudC5SZXNvdXJjZSksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgaXQoXCJyZWRlcGxveXMgdGhlIHN0YWdlIG9uIHRoaXMgc3RhY2sncyBVUERBVEVfQ09NUExFVEVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc3ludGgoKTtcblxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6RXZlbnRzOjpSdWxlXCIsIHtcbiAgICAgIEV2ZW50UGF0dGVybjoge1xuICAgICAgICBzb3VyY2U6IFtcImF3cy5jbG91ZGZvcm1hdGlvblwiXSxcbiAgICAgICAgXCJkZXRhaWwtdHlwZVwiOiBbXCJDbG91ZEZvcm1hdGlvbiBTdGFjayBTdGF0dXMgQ2hhbmdlXCJdLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBcInN0YWNrLWlkXCI6IFt7IFJlZjogXCJBV1M6OlN0YWNrSWRcIiB9XSxcbiAgICAgICAgICBcInN0YXR1cy1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHN0YXR1czogW1wiVVBEQVRFX0NPTVBMRVRFXCIsIFwiVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgVGFyZ2V0czogW1xuICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBBcm46IHsgXCJGbjo6R2V0QXR0XCI6IFtNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiUmVkZXBsb3lGblwiKSwgXCJBcm5cIl0gfSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6TGFtYmRhOjpGdW5jdGlvblwiLCB7XG4gICAgICBIYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczoge1xuICAgICAgICAgIFJFU1RfQVBJX0lEOiB7IFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIlJlc3RBcGlcIikgfSxcbiAgICAgICAgICBTVEFHRV9OQU1FOiB7IFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIkRlcGxveW1lbnRTdGFnZVwiKSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzY29wZXMgaXRzIEFQSSBHYXRld2F5IGFjY2VzcyB0byB0aGlzIFJFU1QgQVBJXCIsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gZ3JhbnRlZFJlc291cmNlcyhzeW50aCgpKTtcblxuICAgIGV4cGVjdChzdGF0ZW1lbnRzLm1hcCgoczogeyBhY3Rpb246IHN0cmluZyB9KSA9PiBzLmFjdGlvbikpLnRvRXF1YWwoW1xuICAgICAgXCJhcGlnYXRld2F5OlBPU1RcIixcbiAgICAgIFwiYXBpZ2F0ZXdheTpHRVRcIixcbiAgICAgIFwiYXBpZ2F0ZXdheTpERUxFVEVcIixcbiAgICBdKTtcbiAgICBmb3IgKGNvbnN0IHsgcmVzb3VyY2VzIH0gb2Ygc3RhdGVtZW50cykge1xuICAgICAgZXhwZWN0KHJlc291cmNlcykudG9Db250YWluKFwiL3Jlc3RhcGlzL1wiKTtcbiAgICAgIGV4cGVjdChyZXNvdXJjZXMpLnRvTWF0Y2goL1wiUmVmXCI6XCJOZXh0anNBcGlSZXN0QXBpWzAtOUEtRl0rXCIvKTtcbiAgICAgIGV4cGVjdChyZXNvdXJjZXMpLm5vdC50b01hdGNoKC9yZXN0YXBpc1xcL1xcKi8pO1xuICAgIH1cbiAgICBleHBlY3Qoc3RhdGVtZW50c1swXS5yZXNvdXJjZXMpLnRvQ29udGFpbihcIi9kZXBsb3ltZW50c1wiKTtcbiAgICBleHBlY3Qoc3RhdGVtZW50c1syXS5yZXNvdXJjZXMpLnRvQ29udGFpbihcIi9kZXBsb3ltZW50cy8qXCIpO1xuICB9KTtcblxuICBpdChcImlzIG9mZiB3aGVuIHJlZGVwbG95QWZ0ZXJVcGRhdGUgaXMgZmFsc2VcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc3ludGgoeyByZWRlcGxveUFmdGVyVXBkYXRlOiBmYWxzZSB9KTtcblxuICAgIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcyhcIkFXUzo6RXZlbnRzOjpSdWxlXCIsIDApO1xuICB9KTtcblxuICBpdChcImlzIG9mZiB3aGVuIHRoZSBBUEkgZGVwbG95cyBubyBzdGFnZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzeW50aCh7XG4gICAgICBvdmVycmlkZXM6IHsgcmVzdEFwaVByb3BzOiB7IGRlcGxveTogZmFsc2UgfSB9LFxuICAgIH0pO1xuXG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKFwiQVdTOjpFdmVudHM6OlJ1bGVcIiwgMCk7XG4gIH0pO1xuXG4gIGl0KFwidGFrZXMgZnVuY3Rpb24gb3ZlcnJpZGVzXCIsICgpID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHN5bnRoKHtcbiAgICAgIG92ZXJyaWRlczogeyByZWRlcGxveUZ1bmN0aW9uUHJvcHM6IHsgbWVtb3J5U2l6ZTogNTEyIH0gfSxcbiAgICB9KTtcblxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6TGFtYmRhOjpGdW5jdGlvblwiLCB7XG4gICAgICBNZW1vcnlTaXplOiA1MTIsXG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHsgUkVTVF9BUElfSUQ6IE1hdGNoLmFueVZhbHVlKCkgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hcGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw2Q0FBeUM7QUFDekMsdURBQXNFO0FBQ3RFLCtFQUFpRTtBQUNqRSx1REFLZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCw2Q0FBeUQ7QUFFekQ7Ozs7R0FJRztBQUNILFNBQVMsT0FBTyxDQUNkLE1BTUc7SUFFSCxPQUFPO1FBQ0wsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSTtZQUNKLFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQy9DLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDN0IsSUFBQSxpQ0FBZSxFQUFDLEtBQUssRUFBRTtZQUNyQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLO1lBQzNDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtZQUNsQyxPQUFPLEVBQUUsUUFBUTtTQUNsQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDN0QsQ0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsSUFBSSxLQUFZLENBQUM7SUFFakIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FB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QUFDLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7UUFDbEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLFNBQVMsRUFBRSxFQUFFLHFCQUFxQixFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFO1NBQzFELENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUN0RCxVQUFVLEVBQUUsR0FBRztZQUNmLFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0JBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRTthQUM3QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEFubm90YXRpb25zLCBNYXRjaCwgVGVtcGxhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sXG4gIElGdW5jdGlvbixcbiAgUnVudGltZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHBhdGhQYXR0ZXJuc0ZvciB9IGZyb20gXCIuL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBOZXh0anNBcGksIE5leHRqc0FwaVByb3BzIH0gZnJvbSBcIi4vbmV4dGpzLWFwaVwiO1xuXG4vKipcbiAqIGBmdW5jdGlvbkdyb3Vwc2AgYW5kIHRoZSBgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc2AgdGhlIGJ1aWxkIHdvdWxkIHJlY29yZCBmb3JcbiAqIHRoZW06IGByb3V0ZXNgIGFzIHJvdXRlZCAoYW4gb3B0aW9uYWwgY2F0Y2gtYWxsJ3MgcGFyZW50IGxpc3RlZCBieSBoYW5kKSxcbiAqIHdpdGggZGF0YS1VUkwgYmVoYXZpb3JzIGZvciBhIGdyb3VwIHRoYXQgb3ducyBhIFBhZ2VzIFJvdXRlciBwYWdlLlxuICovXG5mdW5jdGlvbiBncm91cGVkKFxuICBncm91cHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcm91dGVzOiBzdHJpbmdbXTtcbiAgICBoYXNEYXRhUm91dGVzPzogYm9vbGVhbjtcbiAgICB0cmFpbGluZ1NsYXNoPzogYm9vbGVhbjtcbiAgICBmdW5jdGlvbjogSUZ1bmN0aW9uO1xuICB9W10sXG4pOiBQaWNrPE5leHRqc0FwaVByb3BzLCBcImZ1bmN0aW9uR3JvdXBzXCIgfCBcImZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNcIj4ge1xuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uR3JvdXBzOiBncm91cHMubWFwKCh7IG5hbWUsIGZ1bmN0aW9uOiBmbiB9KSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIGZ1bmN0aW9uOiBmbixcbiAgICB9KSksXG4gICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9yczogZ3JvdXBzLmZsYXRNYXAoKGdyb3VwKSA9PlxuICAgICAgZ3JvdXAucm91dGVzLmZsYXRNYXAoKHJvdXRlKSA9PlxuICAgICAgICBwYXRoUGF0dGVybnNGb3Iocm91dGUsIHtcbiAgICAgICAgICBoYXNEYXRhUm91dGVzOiBncm91cC5oYXNEYXRhUm91dGVzID8/IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nU2xhc2g6IGdyb3VwLnRyYWlsaW5nU2xhc2gsXG4gICAgICAgICAgYnVpbGRJZDogXCJhYmMxMjNcIixcbiAgICAgICAgfSkubWFwKChwYXR0ZXJuKSA9PiAoeyBncm91cDogZ3JvdXAubmFtZSwgcm91dGUsIHBhdHRlcm4gfSkpLFxuICAgICAgKSxcbiAgICApLFxuICB9O1xufVxuXG5kZXNjcmliZShcIk5leHRqc0FwaVwiLCAoKSA9PiB7XG4gIGxldCBzdGFjazogU3RhY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiLCB7XG4gICAgICBlbnY6IHsgYWNjb3VudDogXCIxMjM0NTY3ODkwMTJcIiwgcmVnaW9uOiBcInVzLWVhc3QtMVwiIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFwaShzdGF0aWNBc3NldHNLZXlQcmVmaXg/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgc3RhdGljQXNzZXRzS2V5UHJlZml4LFxuICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcImZhdmljb24uaWNvXCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9LFxuICAgICAgICB7IG5hbWU6IFwiaW1hZ2VzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBpbnRlZ3JhdGlvbnMgYWRkcmVzcyBvYmplY3RzIGJ5IGtleSwgc28gdGhlIHVwbG9hZGVkIGtleSBwcmVmaXggaGFzXG4gICAqIHRvIGFwcGVhciBpbiB0aGUgaW50ZWdyYXRpb24gVVJJIG9yIGV2ZXJ5IHN0YXRpYyByZXF1ZXN0IDQwNHMuXG4gICAqL1xuICBmdW5jdGlvbiBzM0ludGVncmF0aW9uS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIixcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlciA9IFwiczM6cGF0aC9teS1idWNrZXQvXCI7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobWV0aG9kcylcbiAgICAgIC5mbGF0TWFwKChtZXRob2QpID0+IG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLlVyaVtcIkZuOjpKb2luXCJdWzFdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHBhcnQ6IHVua25vd24pOiBwYXJ0IGlzIHN0cmluZyA9PlxuICAgICAgICAgIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIHBhcnQuaW5jbHVkZXMobWFya2VyKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQuc3BsaXQobWFya2VyKVsxXSk7XG4gIH1cblxuICBpdChcImFkZHJlc3NlcyBvYmplY3RzIGF0IHRoZSBidWNrZXQgcm9vdCB3aGVuIG5vIGtleSBwcmVmaXggaXMgc2V0XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoKTtcblxuICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICBcIl9uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICAgXCJmYXZpY29uLmljb1wiLFxuICAgICAgXCJpbWFnZXMve2tleX1cIixcbiAgICBdKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJzZXJ2aWNlIHdvcmtlcnNcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VXb3JrZXJBcGkoc2VydmljZVdvcmtlckFsbG93ZWQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgc2VydmljZVdvcmtlckFsbG93ZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdChcInNlbmRzIFNlcnZpY2UtV29ya2VyLUFsbG93ZWQgZnJvbSBhIHJlc291cmNlIG9mIHRoZWlyIG93blwiLCAoKSA9PiB7XG4gICAgICBjcmVhdGVTZXJ2aWNlV29ya2VyQXBpKFwiL1wiKTtcbiAgICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAgIFwiX25leHQvc3RhdGljL3NlcnZpY2Utd29ya2VyL3trZXl9XCIsXG4gICAgICAgIFwiX25leHQvc3RhdGljL3trZXl9XCIsXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6QXBpR2F0ZXdheTo6TWV0aG9kXCIsIHtcbiAgICAgICAgSW50ZWdyYXRpb246IHtcbiAgICAgICAgICBVcmk6IHtcbiAgICAgICAgICAgIFwiRm46OkpvaW5cIjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgICAgTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiX25leHQvc3RhdGljL3NlcnZpY2Utd29ya2VyL1xcXFx7a2V5XFxcXH1cIiksXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBJbnRlZ3JhdGlvblJlc3BvbnNlczogTWF0Y2guYXJyYXlXaXRoKFxuICAgICAgICAgICAgW1wiMjAwXCIsIFwiMzA0XCJdLm1hcCgoU3RhdHVzQ29kZSkgPT5cbiAgICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgICAgU3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICBSZXNwb25zZVBhcmFtZXRlcnM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLlNlcnZpY2UtV29ya2VyLUFsbG93ZWRcIjogXCInLydcIixcbiAgICAgICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIE1ldGhvZFJlc3BvbnNlczogTWF0Y2guYXJyYXlXaXRoKFxuICAgICAgICAgIFtcIjIwMFwiLCBcIjMwNFwiXS5tYXAoKFN0YXR1c0NvZGUpID0+XG4gICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgU3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgUmVzcG9uc2VQYXJhbWV0ZXJzOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuU2VydmljZS1Xb3JrZXItQWxsb3dlZFwiOiB0cnVlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIC8vIFRoZSByZXN0IG9mIGBfbmV4dC9zdGF0aWNgIGRvZXNuJ3Qgc2VuZCBpdC5cbiAgICAgIGNvbnN0IG90aGVycyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZFwiKSxcbiAgICAgICkuZmlsdGVyKChtZXRob2QpID0+XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLlVyaSkuaW5jbHVkZXMoXG4gICAgICAgICAgXCJfbmV4dC9zdGF0aWMve2tleX1cIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBleHBlY3Qob3RoZXJzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkob3RoZXJzWzBdKSkubm90LnRvQ29udGFpbihcIlNlcnZpY2UtV29ya2VyLUFsbG93ZWRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIHRoZSBoZWFkZXIgdGhyb3VnaCBvdmVycmlkZXMgdGhhdCByZXBsYWNlIHRoZSByZXNwb25zZXNcIiwgKCkgPT4ge1xuICAgICAgLy8gQm90aCBvdmVycmlkZXMgcmVwbGFjZSB0aGVpciBvYmplY3Qgd2hvbGUuIEFQSSBHYXRld2F5IHJlamVjdHMgYW5cbiAgICAgIC8vIGludGVncmF0aW9uIHJlc3BvbnNlIG1hcHBpbmcgYSBoZWFkZXIgdGhlIG1ldGhvZCByZXNwb25zZSBkb2Vzbid0XG4gICAgICAvLyBkZWNsYXJlLCBzbyB0aGUgdHdvIGhhdmUgdG8gc3Vydml2ZSB0b2dldGhlci5cbiAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICBzZXJ2aWNlV29ya2VyQWxsb3dlZDogXCIvXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIHMzTWV0aG9kT3B0aW9uczoge1xuICAgICAgICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHsgXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCI6IHRydWUgfSxcbiAgICAgICAgICAgIG1ldGhvZFJlc3BvbnNlczogW3sgc3RhdHVzQ29kZTogXCIyMDBcIiB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBtZXRob2RzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIiksXG4gICAgICApLmZpbHRlcigobWV0aG9kKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeShtZXRob2QuUHJvcGVydGllcy5JbnRlZ3JhdGlvbi5VcmkpLmluY2x1ZGVzKFxuICAgICAgICAgIFwic2VydmljZS13b3JrZXJcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QobWV0aG9kcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KG1ldGhvZHNbMF0uUHJvcGVydGllcy5NZXRob2RSZXNwb25zZXMpLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgU3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICBSZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5TZXJ2aWNlLVdvcmtlci1BbGxvd2VkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyB0aGUgaGVhZGVyIHRocm91Z2ggYSBzdGF0aWNJbnRlZ3JhdGlvblByb3BzLm9wdGlvbnMgb3ZlcnJpZGVcIiwgKCkgPT4ge1xuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIHNlcnZpY2VXb3JrZXJBbGxvd2VkOiBcIi9cIixcbiAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgc3RhdGljSW50ZWdyYXRpb25Qcm9wczoge1xuICAgICAgICAgICAgc2VydmljZTogXCJzM1wiLFxuICAgICAgICAgICAgcGF0aDogXCJteS1idWNrZXQvX25leHQvc3RhdGljL3trZXl9XCIsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXF1ZXN0LnBhdGgua2V5XCI6IFwibWV0aG9kLnJlcXVlc3QucGF0aC5wcm94eVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW1xuICAgICAgICAgICAgICAgIHsgc3RhdHVzQ29kZTogXCIyMDBcIiB9LFxuICAgICAgICAgICAgICAgIHsgc3RhdHVzQ29kZTogXCI0MDRcIiwgc2VsZWN0aW9uUGF0dGVybjogXCI0MDRcIiB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBPYmplY3QudmFsdWVzKFxuICAgICAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkFwaUdhdGV3YXk6Ok1ldGhvZFwiKSxcbiAgICAgIClcbiAgICAgICAgLmZpbHRlcigobWV0aG9kKSA9PiBtZXRob2QuUHJvcGVydGllcy5JbnRlZ3JhdGlvbi5UeXBlID09PSBcIkFXU1wiKVxuICAgICAgICAubWFwKChtZXRob2QpID0+IG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLkludGVncmF0aW9uUmVzcG9uc2VzKTtcbiAgICAgIC8vIEV2ZXJ5IFMzIG1ldGhvZCBnZXRzIHRoZSBvdmVycmlkZTsgdGhlIG9uZSB0aGF0IGRlY2xhcmVzIHRoZSBoZWFkZXIgaW5cbiAgICAgIC8vIGl0cyBtZXRob2QgcmVzcG9uc2Ugc3RpbGwgbWFwcyBpdCwgYW5kIG9ubHkgb24gdGhlIDIwMC5cbiAgICAgIGV4cGVjdChyZXNwb25zZXMpLnRvQ29udGFpbkVxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIFN0YXR1c0NvZGU6IFwiMjAwXCIsXG4gICAgICAgICAgUmVzcG9uc2VQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuU2VydmljZS1Xb3JrZXItQWxsb3dlZFwiOiBcIicvJ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgU3RhdHVzQ29kZTogXCI0MDRcIiwgU2VsZWN0aW9uUGF0dGVybjogXCI0MDRcIiB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImFkZHMgbm8gcmVzb3VyY2Ugd2l0aG91dCBzZXJ2aWNlIHdvcmtlcnNcIiwgKCkgPT4ge1xuICAgICAgY3JlYXRlU2VydmljZVdvcmtlckFwaSgpO1xuICAgICAgZXhwZWN0KHMzSW50ZWdyYXRpb25LZXlzKCkpLnRvRXF1YWwoW1wiX25leHQvc3RhdGljL3trZXl9XCJdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJwcmVmaXhlcyBldmVyeSBTMyBpbnRlZ3JhdGlvbiBrZXkgd2l0aCB0aGUgc3RhdGljIGFzc2V0cyBrZXkgcHJlZml4XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoXCJicmFuY2gteFwiKTtcblxuICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICBcImJyYW5jaC14L19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICAgXCJicmFuY2gteC9mYXZpY29uLmljb1wiLFxuICAgICAgXCJicmFuY2gteC9pbWFnZXMve2tleX1cIixcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJub3JtYWxpemVzIHN1cnJvdW5kaW5nIHNsYXNoZXMgb24gdGhlIGtleSBwcmVmaXhcIiwgKCkgPT4ge1xuICAgIGNyZWF0ZUFwaShcIi9icmFuY2gteC9cIik7XG5cbiAgICBleHBlY3QoczNJbnRlZ3JhdGlvbktleXMoKSkudG9Db250YWluKFwiYnJhbmNoLXgvX25leHQvc3RhdGljL3trZXl9XCIpO1xuICB9KTtcblxuICAvKiogVGhlIHN0YXRlbWVudHMgb2YgdGhlIEFQSSBHYXRld2F5IOKGkiBTMyBpbnRlZ3JhdGlvbiByb2xlJ3MgcG9saWN5LiAqL1xuICBmdW5jdGlvbiBzdGF0aWNJbnRlZ3JhdGlvblN0YXRlbWVudHMoKSB7XG4gICAgY29uc3QgcG9saWNpZXMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6SUFNOjpQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIFJvbGVzOiBbeyBSZWY6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJTdGF0aWNJbnRlZ3JhdGlvblJvbGVcIikgfV0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocG9saWNpZXMpLmZsYXRNYXAoXG4gICAgICAocG9saWN5KSA9PiBwb2xpY3kuUHJvcGVydGllcy5Qb2xpY3lEb2N1bWVudC5TdGF0ZW1lbnQsXG4gICAgKTtcbiAgfVxuXG4gIGl0KFwic2NvcGVzIHRoZSBTMyBpbnRlZ3JhdGlvbiByb2xlIHRvIHRoZSBzdGF0aWMgYXNzZXRzIGtleSBwcmVmaXhcIiwgKCkgPT4ge1xuICAgIC8vIEEgc2hhcmVkIGJ1Y2tldCBob2xkcyBvdGhlciBhcHBzJyBhc3NldHMgdW5kZXIgdGhlaXIgb3duIHByZWZpeGVzLlxuICAgIGNyZWF0ZUFwaShcIi9icmFuY2gteC9cIik7XG5cbiAgICBjb25zdCBidWNrZXRBcm4gPSB7XG4gICAgICBcIkZuOjpKb2luXCI6IFtcIlwiLCBbXCJhcm46XCIsIHsgUmVmOiBcIkFXUzo6UGFydGl0aW9uXCIgfSwgXCI6czM6OjpteS1idWNrZXRcIl1dLFxuICAgIH07XG4gICAgZXhwZWN0KHN0YXRpY0ludGVncmF0aW9uU3RhdGVtZW50cygpKS50b0VxdWFsKFtcbiAgICAgIHtcbiAgICAgICAgQWN0aW9uOiBcInMzOkdldE9iamVjdFwiLFxuICAgICAgICBFZmZlY3Q6IFwiQWxsb3dcIixcbiAgICAgICAgUmVzb3VyY2U6IHtcbiAgICAgICAgICBcIkZuOjpKb2luXCI6IFtcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBbXCJhcm46XCIsIHsgUmVmOiBcIkFXUzo6UGFydGl0aW9uXCIgfSwgXCI6czM6OjpteS1idWNrZXQvYnJhbmNoLXgvKlwiXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gVW5jb25kaXRpb25lZDogUzMgY2hlY2tzIGl0IGR1cmluZyBhIEdldE9iamVjdCwgd2l0aCBubyBgczM6cHJlZml4YC5cbiAgICAgICAgQWN0aW9uOiBcInMzOkxpc3RCdWNrZXRcIixcbiAgICAgICAgRWZmZWN0OiBcIkFsbG93XCIsXG4gICAgICAgIFJlc291cmNlOiBidWNrZXRBcm4sXG4gICAgICB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcImxldHMgdGhlIFMzIGludGVncmF0aW9uIHJvbGUgcmVhZCB0aGUgd2hvbGUgYnVja2V0IHdpdGhvdXQgYSBrZXkgcHJlZml4XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBzdGF0aWNJbnRlZ3JhdGlvblN0YXRlbWVudHMoKTtcbiAgICBleHBlY3Qoc3RhdGVtZW50cykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIGV4cGVjdChzdGF0ZW1lbnRzWzBdLlJlc291cmNlW1wiRm46OkpvaW5cIl1bMV0pLnRvQ29udGFpbihcbiAgICAgIFwiOnMzOjo6bXktYnVja2V0LypcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImtlZXBzIHRoZSBrZXkgcHJlZml4IGluZGVwZW5kZW50IG9mIGJhc2VQYXRoLCB3aGljaCBpcyB0aGUgVVJMIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgLy8gQSBOZXh0anNSZWdpb25hbEZ1bmN0aW9ucyBhcHAgd2hvc2UgYGJhc2VQYXRoYCBtYXRjaGVzIHRoZSBBUEkgR2F0ZXdheVxuICAgIC8vIHN0YWdlIHN0aWxsIGhhcyBpdHMgYXNzZXRzIGF0IHRoZSBidWNrZXQgcm9vdC5cbiAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICBiYXNlUGF0aDogXCIvcHJvZFwiLFxuICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHMzSW50ZWdyYXRpb25LZXlzKCkpLnRvRXF1YWwoW1wiX25leHQvc3RhdGljL3trZXl9XCJdKTtcbiAgICAvLyAuLi5zZXJ2ZWQgdW5kZXIgdGhlIHN0YWdlLW1hdGNoaW5nIFVSTCBwcmVmaXguXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIixcbiAgICAgIHsgUGF0aFBhcnQ6IFwicHJvZFwiIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gQVBJIEdhdGV3YXkgcGF0aCBwYXJ0cyBjYW4ndCBjb250YWluIFwiL1wiLCBzbyBhIG5lc3RlZCBiYXNlUGF0aCBwYXNzZWQgd2hvbGVcbiAgLy8gdG8gYGFkZFJlc291cmNlYCBmYWlscyBDREsncyBgdmFsaWRhdGVSZXNvdXJjZVBhdGhQYXJ0YCBhdCBzeW50aC4gSXQnc1xuICAvLyByZWFjaGFibGU6IGByZXNvbHZlQmFzZVBhdGhgIGFjY2VwdHMgYSBuZXN0ZWQgcHJvcCBmb3IgUkVHSU9OQUxfRlVOQ1RJT05TIGFzXG4gIC8vIGxvbmcgYXMgdGhlIGFwcCdzIGJhc2VQYXRoIGVuZHMgd2l0aCBpdC5cbiAgZGVzY3JpYmUoXCJuZXN0ZWQgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHBhdGhQYXJ0cygpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpSZXNvdXJjZVwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJlc291cmNlcykubWFwKFxuICAgICAgICAocmVzb3VyY2UpID0+IHJlc291cmNlLlByb3BlcnRpZXMuUGF0aFBhcnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFwaVdpdGhCYXNlUGF0aChiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIGJhc2VQYXRoLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoXCJjcmVhdGVzIG9uZSByZXNvdXJjZSBwZXIgc2VnbWVudFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gY3JlYXRlQXBpV2l0aEJhc2VQYXRoKFwiL3RlYW0vYXBwXCIpKS5ub3QudG9UaHJvdygpO1xuXG4gICAgICBleHBlY3QocGF0aFBhcnRzKCkpLnRvRXF1YWwoXG4gICAgICAgIGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1widGVhbVwiLCBcImFwcFwiLCBcIl9uZXh0XCIsIFwie3Byb3h5K31cIl0pLFxuICAgICAgKTtcbiAgICAgIC8vIE5vdCB0aGUgdW5zcGxpdCB2YWx1ZSwgd2hpY2ggQVBJIEdhdGV3YXkgd291bGQgcmVqZWN0LlxuICAgICAgZXhwZWN0KHBhdGhQYXJ0cygpKS5ub3QudG9Db250YWluKFwidGVhbS9hcHBcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm5lc3RzIHRoZSBzZWdtZW50cyBzbyB0aGUgYXBwIGlzIHJlYWNoYWJsZSB1bmRlciB0aGUgZnVsbCBwYXRoXCIsICgpID0+IHtcbiAgICAgIGNyZWF0ZUFwaVdpdGhCYXNlUGF0aChcIi90ZWFtL2FwcFwiKTtcblxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIixcbiAgICAgICk7XG4gICAgICBjb25zdCBieVBhdGhQYXJ0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VdKSA9PiBbXG4gICAgICAgICAgcmVzb3VyY2UuUHJvcGVydGllcy5QYXRoUGFydCxcbiAgICAgICAgICB7IGxvZ2ljYWxJZCwgcGFyZW50SWQ6IHJlc291cmNlLlByb3BlcnRpZXMuUGFyZW50SWQgfSxcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgICAgLy8gXCJhcHBcIiBoYW5ncyBvZmYgXCJ0ZWFtXCIsIG5vdCBvZmYgdGhlIEFQSSByb290LlxuICAgICAgZXhwZWN0KGJ5UGF0aFBhcnQuYXBwLnBhcmVudElkKS50b0VxdWFsKHtcbiAgICAgICAgUmVmOiBieVBhdGhQYXJ0LnRlYW0ubG9naWNhbElkLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoYnlQYXRoUGFydC50ZWFtLnBhcmVudElkKS50b0hhdmVQcm9wZXJ0eShcIkZuOjpHZXRBdHRcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInN0aWxsIGNyZWF0ZXMgYSBzaW5nbGUgcmVzb3VyY2UgZm9yIGEgZmxhdCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBjcmVhdGVBcGlXaXRoQmFzZVBhdGgoXCIvYmFzZVwiKTtcblxuICAgICAgZXhwZWN0KHBhdGhQYXJ0cygpKS50b0NvbnRhaW4oXCJiYXNlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInVybFwiLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gY3JlYXRlQXBpV2l0aE92ZXJyaWRlcyhcbiAgICAgIHByb3BzOiBQYXJ0aWFsPE5leHRqc0FwaVByb3BzPiA9IHt9LFxuICAgICk6IE5leHRqc0FwaSB7XG4gICAgICByZXR1cm4gbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9tYWluTmFtZShiYXNlUGF0aD86IHN0cmluZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZG9tYWluTmFtZTogXCJhcHAuZXhhbXBsZS5jb21cIixcbiAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybihcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICBcIkNlcnRcIixcbiAgICAgICAgICBcImFybjphd3M6YWNtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Y2VydGlmaWNhdGUvYWJjXCIsXG4gICAgICAgICksXG4gICAgICAgIGJhc2VQYXRoLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUkVTVCBBUEkgaWQsIHRoZSBzdGFnZSBuYW1lIGFuZCB0aGUgZG9tYWluIG5hbWUgYXJlIGFsbCB0b2tlbnMgdGhhdFxuICAgICAqIG9ubHkgcmVzb2x2ZSBhdCBkZXBsb3kgdGltZSwgc28gZmxhdHRlbiB0aGUgcmVzb2x2ZWQgYEZuOjpKb2luYCBhbmQgc3RhbmRcbiAgICAgKiBlYWNoIHJlZmVyZW5jZSBpbiBmb3IgdGhlIHJlc291cmNlIGl0IHBvaW50cyBhdCAobWludXMgQ0RLJ3MgbG9naWNhbCBpZFxuICAgICAqIGhhc2ggc3VmZml4KS4gVGhhdCBrZWVwcyB0aGUgYXNzZXJ0aW9ucyBhYm91dCAqd2hpY2gqIHJlc291cmNlIHN1cHBsaWVzXG4gICAgICogZWFjaCBwYXJ0IG9mIHRoZSBVUkwsIHdoaWNoIGlzIHRoZSB3aG9sZSBxdWVzdGlvbiBoZXJlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwoYXBpOiBOZXh0anNBcGkpOiBzdHJpbmcge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBzdGFjay5yZXNvbHZlKGFwaS51cmwpO1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRbXCJGbjo6Sm9pblwiXVsxXVxuICAgICAgICAubWFwKChwYXJ0OiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IHBhcnRcbiAgICAgICAgICAgIDogYHskeyhwYXJ0IGFzIHsgUmVmOiBzdHJpbmcgfSkuUmVmLnJlcGxhY2UoL1swLTlBLUZdezh9JC8sIFwiXCIpfX1gLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXCIpO1xuICAgIH1cblxuICAgIGl0KFwicmVwb3J0cyB0aGUgZXhlY3V0ZS1hcGkgZW5kcG9pbnQgd2l0aCB0aGUgc3RhZ2UgYXBwZW5kZWQgd2hlbiB0aGVyZSdzIG5vIGN1c3RvbSBkb21haW5cIiwgKCkgPT4ge1xuICAgICAgLy8gVGhlIHN0YWdlIGlzIGluIHRoZSBwYXRoIG9ubHkgaGVyZSwgd2hpY2ggaXMgdGhlIHdob2xlIHJlYXNvbiB0aGVcbiAgICAgIC8vIHJlZ2lvbmFsLWZ1bmN0aW9ucyBleGFtcGxlIHNldHMgYW4gYXBwIGJhc2VQYXRoIG9mIFwiL3Byb2RcIi5cbiAgICAgIGV4cGVjdChyZXNvbHZlVXJsKGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoKSkpLnRvQmUoXG4gICAgICAgIFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaX0uZXhlY3V0ZS1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20ve05leHRqc0FwaVJlc3RBcGlEZXBsb3ltZW50U3RhZ2Vwcm9kfVwiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiYXBwZW5kcyBiYXNlUGF0aCwgd2hpY2ggbmVzdHMgZXZlcnkgcmVzb3VyY2UgYSBsZXZlbCBkb3duXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZVVybChjcmVhdGVBcGlXaXRoT3ZlcnJpZGVzKHsgYmFzZVBhdGg6IFwiL215LWJhc2UtcGF0aFwiIH0pKSxcbiAgICAgICkudG9CZShcbiAgICAgICAgXCJodHRwczovL3tOZXh0anNBcGlSZXN0QXBpfS5leGVjdXRlLWFwaS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS97TmV4dGpzQXBpUmVzdEFwaURlcGxveW1lbnRTdGFnZXByb2R9L215LWJhc2UtcGF0aFwiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicHJlZmVycyBhIGN1c3RvbSBkb21haW4gYW5kIGRyb3BzIHRoZSBzdGFnZSBmcm9tIHRoZSBwYXRoXCIsICgpID0+IHtcbiAgICAgIC8vIEEgZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCBpcyB0aGUgY2xlYW5lc3QgUmVnaW9uYWwgc2V0dXA6IG5vIHN0YWdlIGluXG4gICAgICAvLyB0aGUgVVJMIG1lYW5zIG5vIGJhc2VQYXRoIGFuZCBubyBzdGFnZSB3b3JrYXJvdW5kcyBhbnl3aGVyZS4gVGhlIHN0YWdlIGlzXG4gICAgICAvLyByZWFjaGVkIHRocm91Z2ggdGhlIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nIGluc3RlYWQuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVVcmwoXG4gICAgICAgICAgY3JlYXRlQXBpV2l0aE92ZXJyaWRlcyh7XG4gICAgICAgICAgICBvdmVycmlkZXM6IHsgcmVzdEFwaVByb3BzOiB7IGRvbWFpbk5hbWU6IGRvbWFpbk5hbWUoKSB9IH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApLnRvQmUoXCJodHRwczovL3tOZXh0anNBcGlSZXN0QXBpQ3VzdG9tRG9tYWlufVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaW5jbHVkZXMgYSBjdXN0b20gZG9tYWluJ3MgYmFzZSBwYXRoIG1hcHBpbmdcIiwgKCkgPT4ge1xuICAgICAgLy8gQ0RLIHJlamVjdHMgc3Vycm91bmRpbmcgc2xhc2hlcyBvbiBhIG1hcHBpbmcsIHNvIGl0J3MgYWx3YXlzIGEgYmFyZVxuICAgICAgLy8gc2VnbWVudCBieSB0aGUgdGltZSBpdCBnZXRzIGhlcmUuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVVcmwoXG4gICAgICAgICAgY3JlYXRlQXBpV2l0aE92ZXJyaWRlcyh7XG4gICAgICAgICAgICBvdmVycmlkZXM6IHsgcmVzdEFwaVByb3BzOiB7IGRvbWFpbk5hbWU6IGRvbWFpbk5hbWUoXCJ0ZWFtLWFcIikgfSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaUN1c3RvbURvbWFpbn0vdGVhbS1hXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImZ1bmN0aW9uR3JvdXBzIHJlc291cmNlIHRyZWVcIiwgKCkgPT4ge1xuICAgIC8qKiBMYW1iZGEgZnVuY3Rpb25zIHRoYXQgYEFOWWAgb24gdGhlIHJlc291cmNlIGF0IGBwYXRoUGFydGAgaW52b2tlcy4gKi9cbiAgICBmdW5jdGlvbiBhbnlUYXJnZXRzKHBhdGhQYXJ0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpBcGlHYXRld2F5OjpSZXNvdXJjZVwiLCB7XG4gICAgICAgIFByb3BlcnRpZXM6IHsgUGF0aFBhcnQ6IHBhdGhQYXJ0IH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKHJlc291cmNlcyk7XG4gICAgICBleHBlY3QoaWRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBjb25zdCBtZXRob2RzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcyhcIkFXUzo6QXBpR2F0ZXdheTo6TWV0aG9kXCIsIHtcbiAgICAgICAgUHJvcGVydGllczogeyBIdHRwTWV0aG9kOiBcIkFOWVwiLCBSZXNvdXJjZUlkOiB7IFJlZjogaWRzWzBdIH0gfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobWV0aG9kcykubWFwKFxuICAgICAgICAobWV0aG9kKSA9PlxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLlVyaSkubWF0Y2goXG4gICAgICAgICAgICAvKFNlcnZlckZufEdyb3VwRm58UmVwb3J0c0ZuKVtBLUYwLTldKy8sXG4gICAgICAgICAgKSFbMV0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGl0KFwic2VuZHMgYSBncm91cCdzIHBhcmVudCBwYXRocyB0byB0aGUgZGVmYXVsdCBmdW5jdGlvblwiLCAoKSA9PiB7XG4gICAgICAvLyBBUEkgR2F0ZXdheSBhbnN3ZXJzIGEgbWV0aG9kbGVzcyByZXNvdXJjZSB3aXRoIDQwMyByYXRoZXIgdGhhbiBmYWxsaW5nXG4gICAgICAvLyBiYWNrIHRvIHRoZSByb290IGB7cHJveHkrfWAsIHNvIGAvYXBpYCBhbmQgYC9hcGkvcmVwb3J0c2AgbmVlZCBvbmUuXG4gICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgLi4uZ3JvdXBlZChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJyZXBvcnRzXCIsXG4gICAgICAgICAgICByb3V0ZXM6IFtcIi9hcGkvcmVwb3J0cy8qKlwiLCBcIi9hcGkvZXhwb3J0XCJdLFxuICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzKFwiYXBpXCIpKS50b0VxdWFsKFtcIlNlcnZlckZuXCJdKTtcbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzKFwicmVwb3J0c1wiKSkudG9FcXVhbChbXCJTZXJ2ZXJGblwiXSk7XG4gICAgICBleHBlY3QoYW55VGFyZ2V0cyhcImV4cG9ydFwiKSkudG9FcXVhbChbXCJHcm91cEZuXCJdKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2VuZHMgYSBwYXJlbnQgdW5kZXIgYW5vdGhlciBncm91cCdzIHN1YnRyZWUgdG8gdGhhdCBncm91cFwiLCAoKSA9PiB7XG4gICAgICAvLyBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VzIGAvYXBpL3JlcG9ydHNgIGludG8gYGFwaWAsIGFuZFxuICAgICAgLy8gQ2xvdWRGcm9udCdzIGBhcGkvKmAgc2VuZHMgaXQgdGhlcmU7IHNvIG11c3QgQVBJIEdhdGV3YXkuXG4gICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgLi4uZ3JvdXBlZChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJhcGlcIixcbiAgICAgICAgICAgIHJvdXRlczogW1wiL2FwaS8qKlwiXSxcbiAgICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IHRydWUsXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInJlcG9ydHNcIixcbiAgICAgICAgICAgIHJvdXRlczogW1wiL2FwaS9yZXBvcnRzL3ExLyoqXCJdLFxuICAgICAgICAgICAgaGFzRGF0YVJvdXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiUmVwb3J0c0ZuXCIsIHtcbiAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEVhY2ggcGF0aCBwYXJ0IGJlbG93IGFwcGVhcnMgdHdpY2UsIHVuZGVyIGAvYCBhbmQgdW5kZXIgdGhlIGRhdGFcbiAgICAgIC8vIHByZWZpeCwgc28gY2hlY2sgdGhlIHRyZWUgYnkgcGF0aC5cbiAgICAgIGNvbnN0IHRhcmdldHMgPSBhbnlUYXJnZXRzQnlQYXRoKCk7XG4gICAgICBleHBlY3QodGFyZ2V0c1tcIi9hcGlcIl0pLnRvRXF1YWwoW1wiU2VydmVyRm5cIl0pO1xuICAgICAgZXhwZWN0KHRhcmdldHNbXCIvYXBpL3JlcG9ydHNcIl0pLnRvRXF1YWwoW1wiR3JvdXBGblwiXSk7XG4gICAgICBleHBlY3QodGFyZ2V0c1tcIi9hcGkvcmVwb3J0cy9xMVwiXSkudG9FcXVhbChbXCJHcm91cEZuXCJdKTtcbiAgICAgIGV4cGVjdCh0YXJnZXRzW1wiL2FwaS9yZXBvcnRzL3ExL3twcm94eSt9XCJdKS50b0VxdWFsKFtcIlJlcG9ydHNGblwiXSk7XG4gICAgICBleHBlY3QodGFyZ2V0c1tcIi9fbmV4dC9kYXRhL3tidWlsZElkfS9hcGkvcmVwb3J0c1wiXSkudG9FcXVhbChbXCJHcm91cEZuXCJdKTtcbiAgICAgIGV4cGVjdCh0YXJnZXRzW1wiL19uZXh0L2RhdGEve2J1aWxkSWR9XCJdKS50b0VxdWFsKFtcIlNlcnZlckZuXCJdKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUdyb3VwZWRBcGkoaGFzRGF0YVJvdXRlczogYm9vbGVhbikge1xuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicmVwb3J0c1wiLFxuICAgICAgICAgICAgcm91dGVzOiBbXCIvcmVwb3J0cy8qKlwiLCBcIi9kb2NzL2ludHJvXCJdLFxuICAgICAgICAgICAgaGFzRGF0YVJvdXRlcyxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiR3JvdXBGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSByZXNvdXJjZSBwYXRoIGluIHRoZSBBUEksIGUuZy4gYC9fbmV4dC9kYXRhL3tidWlsZElkfS94Lmpzb25gLiAqL1xuICAgIGZ1bmN0aW9uIHJlc291cmNlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIixcbiAgICAgICk7XG4gICAgICBjb25zdCBwYXRoT2YgPSAoaWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHsgUGFyZW50SWQsIFBhdGhQYXJ0IH0gPSByZXNvdXJjZXNbaWRdLlByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IFBhcmVudElkLlJlZjtcbiAgICAgICAgcmV0dXJuIHBhcmVudCAmJiByZXNvdXJjZXNbcGFyZW50XVxuICAgICAgICAgID8gYCR7cGF0aE9mKHBhcmVudCl9LyR7UGF0aFBhcnR9YFxuICAgICAgICAgIDogYC8ke1BhdGhQYXJ0fWA7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc291cmNlcykubWFwKHBhdGhPZikuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKiBSZXNvdXJjZSBwYXRoIOKGkiB0aGUgTGFtYmRhIGZ1bmN0aW9ucyBgQU5ZYCBvbiBpdCBpbnZva2VzLiAqL1xuICAgIGZ1bmN0aW9uIGFueVRhcmdldHNCeVBhdGgoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRlbXBsYXRlLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkFwaUdhdGV3YXk6OlJlc291cmNlXCIpO1xuICAgICAgY29uc3QgcGF0aE9mID0gKGlkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCB7IFBhcmVudElkLCBQYXRoUGFydCB9ID0gcmVzb3VyY2VzW2lkXS5Qcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBQYXJlbnRJZC5SZWY7XG4gICAgICAgIHJldHVybiBwYXJlbnQgJiYgcmVzb3VyY2VzW3BhcmVudF1cbiAgICAgICAgICA/IGAke3BhdGhPZihwYXJlbnQpfS8ke1BhdGhQYXJ0fWBcbiAgICAgICAgICA6IGAvJHtQYXRoUGFydH1gO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG1ldGhvZHMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIiwge1xuICAgICAgICBQcm9wZXJ0aWVzOiB7IEh0dHBNZXRob2Q6IFwiQU5ZXCIgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGFyZ2V0czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBPYmplY3QudmFsdWVzKG1ldGhvZHMpKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbWV0aG9kLlByb3BlcnRpZXMuUmVzb3VyY2VJZD8uUmVmO1xuICAgICAgICBpZiAoIWlkIHx8ICFyZXNvdXJjZXNbaWRdKSBjb250aW51ZTtcbiAgICAgICAgKHRhcmdldHNbcGF0aE9mKGlkKV0gPz89IFtdKS5wdXNoKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLlVyaSkubWF0Y2goXG4gICAgICAgICAgICAvKFNlcnZlckZufEdyb3VwRm58UmVwb3J0c0ZuKVtBLUYwLTldKy8sXG4gICAgICAgICAgKSFbMV0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0cztcbiAgICB9XG5cbiAgICBpdChcInJvdXRlcyBhIGdyb3VwJ3MgUGFnZXMgUm91dGVyIGRhdGEgVVJMcyB0byBpdCB0b29cIiwgKCkgPT4ge1xuICAgICAgY3JlYXRlR3JvdXBlZEFwaSh0cnVlKTtcblxuICAgICAgY29uc3QgcGF0aHMgPSByZXNvdXJjZVBhdGhzKCk7XG4gICAgICBleHBlY3QocGF0aHMpLnRvQ29udGFpbihcIi9fbmV4dC9kYXRhL3tidWlsZElkfS9yZXBvcnRzL3twcm94eSt9XCIpO1xuICAgICAgZXhwZWN0KHBhdGhzKS50b0NvbnRhaW4oXCIvX25leHQvZGF0YS97YnVpbGRJZH0vZG9jcy9pbnRyby5qc29uXCIpO1xuICAgICAgZXhwZWN0KGFueVRhcmdldHMoXCJpbnRyby5qc29uXCIpKS50b0VxdWFsKFtcIkdyb3VwRm5cIl0pO1xuICAgICAgLy8gQSBtZXRob2RsZXNzIHBhcmVudCBhbnN3ZXJzIDQwMywgc28gdGhlIGRhdGEgcHJlZml4IG5lZWRzIHRoZSBkZWZhdWx0LlxuICAgICAgZXhwZWN0KGFueVRhcmdldHMoXCJ7YnVpbGRJZH1cIikpLnRvRXF1YWwoW1wiU2VydmVyRm5cIl0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyBlYWNoIGdyb3VwJ3MgZGF0YSBVUkxzIHRvIGl0cyBvd24gc3VidHJlZSAoQSlcIiwgKCkgPT4ge1xuICAgICAgLy8gYHtidWlsZElkfWAgaXMgb25lIHBhdGggc2VnbWVudCwgd2hlcmUgQ2xvdWRGcm9udCdzIGAqYCBjcm9zc2VkIGAvYDpcbiAgICAgIC8vIGAvX25leHQvZGF0YS88aWQ+L2RvY3MvYmxvZy94Lmpzb25gIGhhcyBubyB3YXkgaW50byBibG9nJ3MgcmVzb3VyY2UuXG4gICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKHN0YWNrLCBcIkJ1Y2tldFwiLCBcIm15LWJ1Y2tldFwiKSxcbiAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgIH0pLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgLi4uZ3JvdXBlZChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJibG9nXCIsXG4gICAgICAgICAgICByb3V0ZXM6IFtcIi9ibG9nLyoqXCJdLFxuICAgICAgICAgICAgaGFzRGF0YVJvdXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiR3JvdXBGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvdXJjZVBhdGhzKCkuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoXCIvX25leHQvZGF0YVwiKSksXG4gICAgICApLnRvRXF1YWwoW1xuICAgICAgICBcIi9fbmV4dC9kYXRhXCIsXG4gICAgICAgIFwiL19uZXh0L2RhdGEve2J1aWxkSWR9XCIsXG4gICAgICAgIFwiL19uZXh0L2RhdGEve2J1aWxkSWR9L2Jsb2dcIixcbiAgICAgICAgXCIvX25leHQvZGF0YS97YnVpbGRJZH0vYmxvZy97cHJveHkrfVwiLFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInJvdXRlcyBhbiBvcHRpb25hbCBjYXRjaC1hbGwncyBwYXJlbnQgdG8gdGhlIGdyb3VwIHdoZW4gaXQgaXMgbGlzdGVkIChCKVwiLCAoKSA9PiB7XG4gICAgICAvLyBUaGUgYnVpbGQgcm91dGVzIGAvc2hvcGAgYWxvbmdzaWRlIGAvc2hvcC8qKmAgd2hlbiB0aGUgZ3JvdXAgb3duc1xuICAgICAgLy8gYHNob3AvW1suLi5zbHVnXV1gIChzZWUgYHJvdXRlZFBhdHRlcm5zYCk6IGB7cHJveHkrfWAgZG9lcyBub3QgbWF0Y2hcbiAgICAgIC8vIHRoZSBwYXJlbnQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSByZWFjaCB0aGUgZGVmYXVsdCBmdW5jdGlvbi5cbiAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAuLi5ncm91cGVkKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3BcIixcbiAgICAgICAgICAgIHJvdXRlczogW1wiL3Nob3AvKipcIiwgXCIvc2hvcFwiXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiR3JvdXBGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGFueVRhcmdldHMoXCJzaG9wXCIpKS50b0VxdWFsKFtcIkdyb3VwRm5cIl0pO1xuICAgIH0pO1xuXG4gICAgaXQuZWFjaChbXG4gICAgICBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfSwgXCIvZG9jcy8qKlwiLCBcImRpcmVjdG9yeVwiXSxcbiAgICAgIFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9LCBcIi9kb2NzL2d1aWRlLyoqXCIsIFwiZGlyZWN0b3J5XCJdLFxuICAgICAgW3sgbmFtZTogXCJyb2JvdHMudHh0XCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9LCBcIi9yb2JvdHMudHh0XCIsIFwiZmlsZVwiXSxcbiAgICBdKShcbiAgICAgIFwicmVqZWN0cyBhIGdyb3VwIHJvdXRlIG9uIGEgcHVibGljLyBlbnRyeSdzIHJlc291cmNlOiAlcCB3aXRoICVwIChFKVwiLFxuICAgICAgKGVudHJ5LCByb3V0ZSwga2luZCkgPT4ge1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICAgICAgXCJCdWNrZXRcIixcbiAgICAgICAgICAgICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtlbnRyeV0sXG4gICAgICAgICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZ1wiLFxuICAgICAgICAgICAgICAgICAgcm91dGVzOiBbcm91dGVdLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJHcm91cEZuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICkudG9UaHJvdyhgb3ZlcmxhcHMgdGhlIHRvcC1sZXZlbCBwdWJsaWMvICR7a2luZH0gXCIke2VudHJ5Lm5hbWV9XCJgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGl0KFwiYWxsb3dzIGFuIGV4YWN0IHJvdXRlIG5hbWVkIGxpa2UgYSBwdWJsaWMvIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IHVuZGVyIGl0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShcbiAgICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICAgIFwiQnVja2V0XCIsXG4gICAgICAgICAgICAgIFwibXktYnVja2V0XCIsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICAgICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJnXCIsXG4gICAgICAgICAgICAgICAgcm91dGVzOiBbXCIvZG9jc1wiXSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdChcInJvdXRlcyBhbiBleGFjdCByb3V0ZSdzIHRyYWlsaW5nU2xhc2ggZm9ybSB0aHJvdWdoIGl0cyBvbmUgcmVzb3VyY2VcIiwgKCkgPT4ge1xuICAgICAgLy8gQ2xvdWRGcm9udCBuZWVkcyBgcHJpY2luZy9gIGFzIGEgYmVoYXZpb3Igb2YgaXRzIG93bjsgQVBJIEdhdGV3YXlcbiAgICAgIC8vIG1hdGNoZXMgYC9wcmljaW5nL2Agb24gdGhlIGBwcmljaW5nYCByZXNvdXJjZSwgc28gdGhlIHZhcmlhbnQgYWRkc1xuICAgICAgLy8gbm90aGluZyBoZXJlIGFuZCBtdXN0IG5vdCBhZGQgdGhlIHJlc291cmNlIHR3aWNlLlxuICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW10sXG4gICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicHJpY2luZ1wiLFxuICAgICAgICAgICAgcm91dGVzOiBbXCIvcHJpY2luZ1wiXSxcbiAgICAgICAgICAgIHRyYWlsaW5nU2xhc2g6IHRydWUsXG4gICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb3VyY2VQYXRocygpLmZpbHRlcigocGF0aCkgPT4gIXBhdGguc3RhcnRzV2l0aChcIi9fbmV4dC9zdGF0aWNcIikpLFxuICAgICAgKS50b0VxdWFsKFtcIi9fbmV4dFwiLCBcIi9wcmljaW5nXCIsIFwiL3twcm94eSt9XCJdKTtcbiAgICAgIGV4cGVjdChhbnlUYXJnZXRzQnlQYXRoKCkpLnRvRXF1YWwoe1xuICAgICAgICBcIi9wcmljaW5nXCI6IFtcIkdyb3VwRm5cIl0sXG4gICAgICAgIFwiL3twcm94eSt9XCI6IFtcIlNlcnZlckZuXCJdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChcInJlamVjdHMgYSBiZWhhdmlvciBmb3IgYSBncm91cCBpdCB3YXMgbm90IGdpdmVuXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyB9ID0gZ3JvdXBlZChbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImFwaVwiLFxuICAgICAgICAgIHJvdXRlczogW1wiL2FwaS8qKlwiXSxcbiAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgICBcIkJ1Y2tldFwiLFxuICAgICAgICAgICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXSxcbiAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgfSksXG4gICAgICApLnRvVGhyb3coL3JvdXRlcyB0byBmdW5jdGlvbiBncm91cCBcImFwaVwiLCB3aGljaCBpcyBub3QgaW4vKTtcbiAgICB9KTtcblxuICAgIGl0KFwiYWRkcyBubyBkYXRhIHJvdXRlcyBmb3IgYW4gYXBwIHdpdGhvdXQgUGFnZXMgUm91dGVyIHJvdXRlc1wiLCAoKSA9PiB7XG4gICAgICBjcmVhdGVHcm91cGVkQXBpKGZhbHNlKTtcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvdXJjZVBhdGhzKCkuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoXCIvX25leHQvZGF0YVwiKSksXG4gICAgICApLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJncmFudHMgZWFjaCBmdW5jdGlvbiBvbmUgQVBJLXNjb3BlZCBwZXJtaXNzaW9uLCBub3QgdHdvIHBlciBtZXRob2RcIiwgKCkgPT4ge1xuICAgICAgLy8gUGVyLW1ldGhvZCBwZXJtaXNzaW9ucyBwdXQgdHdvIHN0YXRlbWVudHMgaW4gdGhlIGZ1bmN0aW9uJ3MgcmVzb3VyY2VcbiAgICAgIC8vIHBvbGljeSBmb3IgZXZlcnkgYEFOWWAsIHdoaWNoIG91dGdyb3dzIExhbWJkYSdzIDIwIEtCIGNhcC5cbiAgICAgIGNyZWF0ZUdyb3VwZWRBcGkodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQVdTOjpMYW1iZGE6OlBlcm1pc3Npb25cIiwge1xuICAgICAgICAgIFByb3BlcnRpZXM6IHsgUHJpbmNpcGFsOiBcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChwZXJtaXNzaW9ucykudG9IYXZlTGVuZ3RoKDIpO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFybiA9IEpTT04uc3RyaW5naWZ5KHBlcm1pc3Npb24uUHJvcGVydGllcy5Tb3VyY2VBcm4pO1xuICAgICAgICBleHBlY3Qoc291cmNlQXJuKS50b0NvbnRhaW4oXCI6ZXhlY3V0ZS1hcGk6XCIpO1xuICAgICAgICBleHBlY3Qoc291cmNlQXJuKS50b0NvbnRhaW4oXCIvKi8qLypcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibmFtZXMgdGhlIGdyb3VwIGFuZCBwYXR0ZXJuIEFQSSBHYXRld2F5IGNhbm5vdCByb3V0ZVwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0LmZyb21CdWNrZXROYW1lKFxuICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICBcIkJ1Y2tldFwiLFxuICAgICAgICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgICAgICApLFxuICAgICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAgIC4uLmdyb3VwZWQoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBcImFib3V0XCIsXG4gICAgICAgICAgICAgIHJvdXRlczogW1wiL2Fib3V0fnVzXCJdLFxuICAgICAgICAgICAgICBmdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkdyb3VwRm5cIiwge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvcGF0dGVybiBcIlxcL2Fib3V0fnVzXCIgXFwoZ3JvdXAgXCJhYm91dFwiXFwpIGhhcyBhIHNlZ21lbnQvKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJhIHB1YmxpYy8gZW50cnkgQVBJIEdhdGV3YXkgY2Fubm90IGFkZHJlc3NcIiwgKCkgPT4ge1xuICAgIGl0KFwid2FybnMgYW5kIHNraXBzIGl0IGluc3RlYWQgb2YgZmFpbGluZyB0aGUgc3ludGhcIiwgKCkgPT4ge1xuICAgICAgLy8gYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCB0aGF0IGBhZGRSZXNvdXJjZWBcbiAgICAgIC8vIHJlamVjdHMgb3V0cmlnaHQsIHRha2luZyB0aGUgd2hvbGUgYXBwJ3Mgc3ludGggd2l0aCBpdC4gVGhlIEdsb2JhbCB0eXBlc1xuICAgICAgLy8gc2VydmUgaXQgd2l0aCBhIHdpbGRjYXJkIHBhdGggcGF0dGVybjsgaGVyZSB0aGUgaG9uZXN0IG91dGNvbWUgaXMgb25lXG4gICAgICAvLyA0MDRpbmcgYXNzZXQgYW5kIGEgd2FybmluZyB0aGF0IG5hbWVzIGl0LlxuICAgICAgY29uc3QgYXBpID0gbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICAgIHNlcnZlckZ1bmN0aW9uOiBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiU2VydmVyRm5cIiwge1xuICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4ge307XCIpLFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogW1xuICAgICAgICAgIHsgbmFtZTogXCJoZWxsbyB3b3JsZC5qcGdcIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcIsOkw7bDvMWhxI3FmcOtLnBuZ1wiLCBpc0RpcmVjdG9yeTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiZmF2aWNvbi5pY29cIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaylcbiAgICAgICAgLmZpbmRXYXJuaW5nKGAvJHthcGkubm9kZS5wYXRofWAsIE1hdGNoLmFueVZhbHVlKCkpXG4gICAgICAgIC5tYXAoKHdhcm5pbmcpID0+IHdhcm5pbmcuZW50cnkuZGF0YSBhcyBzdHJpbmcpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgICAgZXhwZWN0KG1lc3NhZ2UpLnRvQ29udGFpbignXCJoZWxsbyB3b3JsZC5qcGdcIicpO1xuICAgICAgZXhwZWN0KG1lc3NhZ2UpLnRvQ29udGFpbignXCLDpMO2w7zFocSNxZnDrS5wbmdcIicpO1xuICAgICAgZXhwZWN0KG1lc3NhZ2UpLm5vdC50b0NvbnRhaW4oJ1wiZmF2aWNvbi5pY29cIicpO1xuICAgICAgLy8gVGhlIGV4cHJlc3NpYmxlIG9uZSBpcyBzdGlsbCBzZXJ2ZWQuXG4gICAgICBleHBlY3QoczNJbnRlZ3JhdGlvbktleXMoKSkudG9Db250YWluKFwiZmF2aWNvbi5pY29cIik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiTmV4dGpzQXBpIHJlZGVwbG95IGFmdGVyIHVwZGF0ZVwiLCAoKSA9PiB7XG4gIGZ1bmN0aW9uIHN5bnRoKHByb3BzOiBQYXJ0aWFsPE5leHRqc0FwaVByb3BzPiA9IHt9KSB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiLCB7XG4gICAgICBlbnY6IHsgYWNjb3VudDogXCIxMjM0NTY3ODkwMTJcIiwgcmVnaW9uOiBcInVzLWVhc3QtMVwiIH0sXG4gICAgfSk7XG4gICAgbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gIH1cblxuICAvKiogVGhlIGBGbjo6Sm9pbmAgcGFydHMgb2YgZXZlcnkgcmVzb3VyY2UgdGhlIHJlZGVwbG95IHJvbGUgaXMgZ3JhbnRlZC4gKi9cbiAgZnVuY3Rpb24gZ3JhbnRlZFJlc291cmNlcyh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcbiAgICBjb25zdCBbcG9saWN5XSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpJQU06OlBvbGljeVwiLCB7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBQb2xpY3lOYW1lOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiUmVkZXBsb3lGblwiKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHBvbGljeS5Qcm9wZXJ0aWVzLlBvbGljeURvY3VtZW50LlN0YXRlbWVudC5tYXAoXG4gICAgICAoc3RhdGVtZW50OiB7IEFjdGlvbjogc3RyaW5nOyBSZXNvdXJjZTogdW5rbm93biB9KSA9PiAoe1xuICAgICAgICBhY3Rpb246IHN0YXRlbWVudC5BY3Rpb24sXG4gICAgICAgIHJlc291cmNlczogSlNPTi5zdHJpbmdpZnkoc3RhdGVtZW50LlJlc291cmNlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBpdChcInJlZGVwbG95cyB0aGUgc3RhZ2Ugb24gdGhpcyBzdGFjaydzIFVQREFURV9DT01QTEVURVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzeW50aCgpO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpFdmVudHM6OlJ1bGVcIiwge1xuICAgICAgRXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIHNvdXJjZTogW1wiYXdzLmNsb3VkZm9ybWF0aW9uXCJdLFxuICAgICAgICBcImRldGFpbC10eXBlXCI6IFtcIkNsb3VkRm9ybWF0aW9uIFN0YWNrIFN0YXR1cyBDaGFuZ2VcIl0sXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIFwic3RhY2staWRcIjogW3sgUmVmOiBcIkFXUzo6U3RhY2tJZFwiIH1dLFxuICAgICAgICAgIFwic3RhdHVzLWRldGFpbHNcIjoge1xuICAgICAgICAgICAgc3RhdHVzOiBbXCJVUERBVEVfQ09NUExFVEVcIiwgXCJVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEVcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBUYXJnZXRzOiBbXG4gICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIEFybjogeyBcIkZuOjpHZXRBdHRcIjogW01hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJSZWRlcGxveUZuXCIpLCBcIkFyblwiXSB9LFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpMYW1iZGE6OkZ1bmN0aW9uXCIsIHtcbiAgICAgIEhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgUkVTVF9BUElfSUQ6IHsgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiUmVzdEFwaVwiKSB9LFxuICAgICAgICAgIFNUQUdFX05BTUU6IHsgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRGVwbG95bWVudFN0YWdlXCIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNjb3BlcyBpdHMgQVBJIEdhdGV3YXkgYWNjZXNzIHRvIHRoaXMgUkVTVCBBUElcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBncmFudGVkUmVzb3VyY2VzKHN5bnRoKCkpO1xuXG4gICAgZXhwZWN0KHN0YXRlbWVudHMubWFwKChzOiB7IGFjdGlvbjogc3RyaW5nIH0pID0+IHMuYWN0aW9uKSkudG9FcXVhbChbXG4gICAgICBcImFwaWdhdGV3YXk6UE9TVFwiLFxuICAgICAgXCJhcGlnYXRld2F5OkdFVFwiLFxuICAgICAgXCJhcGlnYXRld2F5OkRFTEVURVwiLFxuICAgIF0pO1xuICAgIGZvciAoY29uc3QgeyByZXNvdXJjZXMgfSBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICBleHBlY3QocmVzb3VyY2VzKS50b0NvbnRhaW4oXCIvcmVzdGFwaXMvXCIpO1xuICAgICAgZXhwZWN0KHJlc291cmNlcykudG9NYXRjaCgvXCJSZWZcIjpcIk5leHRqc0FwaVJlc3RBcGlbMC05QS1GXStcIi8pO1xuICAgICAgZXhwZWN0KHJlc291cmNlcykubm90LnRvTWF0Y2goL3Jlc3RhcGlzXFwvXFwqLyk7XG4gICAgfVxuICAgIGV4cGVjdChzdGF0ZW1lbnRzWzBdLnJlc291cmNlcykudG9Db250YWluKFwiL2RlcGxveW1lbnRzXCIpO1xuICAgIGV4cGVjdChzdGF0ZW1lbnRzWzJdLnJlc291cmNlcykudG9Db250YWluKFwiL2RlcGxveW1lbnRzLypcIik7XG4gIH0pO1xuXG4gIGl0KFwiaXMgb2ZmIHdoZW4gcmVkZXBsb3lBZnRlclVwZGF0ZSBpcyBmYWxzZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzeW50aCh7IHJlZGVwbG95QWZ0ZXJVcGRhdGU6IGZhbHNlIH0pO1xuXG4gICAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKFwiQVdTOjpFdmVudHM6OlJ1bGVcIiwgMCk7XG4gIH0pO1xuXG4gIGl0KFwiaXMgb2ZmIHdoZW4gdGhlIEFQSSBkZXBsb3lzIG5vIHN0YWdlXCIsICgpID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHN5bnRoKHtcbiAgICAgIG92ZXJyaWRlczogeyByZXN0QXBpUHJvcHM6IHsgZGVwbG95OiBmYWxzZSB9IH0sXG4gICAgfSk7XG5cbiAgICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoXCJBV1M6OkV2ZW50czo6UnVsZVwiLCAwKTtcbiAgfSk7XG5cbiAgaXQoXCJ0YWtlcyBmdW5jdGlvbiBvdmVycmlkZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gc3ludGgoe1xuICAgICAgb3ZlcnJpZGVzOiB7IHJlZGVwbG95RnVuY3Rpb25Qcm9wczogeyBtZW1vcnlTaXplOiA1MTIgfSB9LFxuICAgIH0pO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpMYW1iZGE6OkZ1bmN0aW9uXCIsIHtcbiAgICAgIE1lbW9yeVNpemU6IDUxMixcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczogeyBSRVNUX0FQSV9JRDogTWF0Y2guYW55VmFsdWUoKSB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -66,7 +66,7 @@ function deploymentArchitecture(props) {
66
66
  * @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
67
67
  */
68
68
  class NextjsBuild extends constructs_1.Construct {
69
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.12" };
69
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.14" };
70
70
  /**
71
71
  * Unique id for this deployment. Used to partition cache storage and as
72
72
  * metadata for static assets in S3 bucket.
@@ -86,7 +86,7 @@ function sizeOfDirectory(dir) {
86
86
  * Next.js Cache construct providing unified S3 and DynamoDB cache management.
87
87
  */
88
88
  class NextjsCache extends constructs_1.Construct {
89
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsCache", version: "0.7.12" };
89
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsCache", version: "0.7.14" };
90
90
  cacheBucket;
91
91
  revalidationTable;
92
92
  buildId;
@@ -19,7 +19,7 @@ const constants_1 = require("../constants");
19
19
  * Fargate.
20
20
  */
21
21
  class NextjsContainers extends constructs_1.Construct {
22
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.7.12" };
22
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.7.14" };
23
23
  albFargateService;
24
24
  ecsCluster;
25
25
  url;
@@ -23,7 +23,7 @@ const zip_directory_1 = require("../utils/zip-directory");
23
23
  * `awslambda.streamifyResponse` directly.
24
24
  */
25
25
  class NextjsFunctions extends constructs_1.Construct {
26
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsFunctions", version: "0.7.12" };
26
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsFunctions", version: "0.7.14" };
27
27
  /**
28
28
  * The `default` group's function: the one the distribution's default behavior
29
29
  * targets, and the only one at all unless `functionGroups` is used.