nextlove 2.3.1 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -1
- package/dist/index.js +82 -17
- package/dist/index.mjs +81 -17
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -38,6 +38,8 @@ type MiddlewareChainOutput<MWChain extends readonly Middleware<any, any>[]> = MW
|
|
|
38
38
|
type AuthMiddlewares = {
|
|
39
39
|
[auth_type: string]: Middleware<any, any>;
|
|
40
40
|
};
|
|
41
|
+
type QueryArrayFormat = "brackets" | "comma" | "repeat";
|
|
42
|
+
type QueryArrayFormats = readonly QueryArrayFormat[];
|
|
41
43
|
interface SetupParams<AuthMW extends AuthMiddlewares = AuthMiddlewares, GlobalMW extends Middleware<any, any>[] = any[]> {
|
|
42
44
|
authMiddlewareMap: AuthMW;
|
|
43
45
|
globalMiddlewares: GlobalMW;
|
|
@@ -49,6 +51,7 @@ interface SetupParams<AuthMW extends AuthMiddlewares = AuthMiddlewares, GlobalMW
|
|
|
49
51
|
shouldValidateGetRequestBody?: boolean;
|
|
50
52
|
securitySchemas?: Record<string, SecuritySchemeObject>;
|
|
51
53
|
globalSchemas?: Record<string, z.ZodTypeAny>;
|
|
54
|
+
supportedArrayFormats?: QueryArrayFormats;
|
|
52
55
|
}
|
|
53
56
|
declare const defaultMiddlewareMap: {
|
|
54
57
|
readonly none: (next: any) => any;
|
|
@@ -76,6 +79,7 @@ type CreateWithRouteSpecFunction = <SP extends SetupParams<AuthMiddlewares, any>
|
|
|
76
79
|
|
|
77
80
|
type ParamDef = z.ZodTypeAny | z.ZodEffects<z.ZodTypeAny>;
|
|
78
81
|
declare const checkRouteSpec: <AuthType extends string = string, Methods extends HTTPMethods[] = HTTPMethods[], JsonBody extends ParamDef = z.ZodTypeAny, QueryParams extends ParamDef = z.ZodTypeAny, CommonParams extends ParamDef = z.ZodTypeAny, Middlewares extends readonly Middleware$1<any, any>[] = readonly Middleware$1<any, any>[], FormData_1 extends ParamDef = z.ZodTypeAny, Spec extends RouteSpec<AuthType, Methods, JsonBody, QueryParams, CommonParams, Middlewares, FormData_1, z.ZodTypeAny> = RouteSpec<AuthType, Methods, JsonBody, QueryParams, CommonParams, Middlewares, FormData_1, z.ZodTypeAny>>(spec: Spec) => string extends Spec["auth"] ? "your route spec is underspecified, add \"as const\"" : Spec;
|
|
82
|
+
declare const DEFAULT_ARRAY_FORMATS: QueryArrayFormats;
|
|
79
83
|
declare const createWithRouteSpec: CreateWithRouteSpecFunction;
|
|
80
84
|
|
|
81
|
-
export { AuthMiddlewares, CreateWithRouteSpecFunction, Middleware, MiddlewareChainOutput, RouteFunction, RouteSpec, SetupParams, checkRouteSpec, createWithRouteSpec, wrappers };
|
|
85
|
+
export { AuthMiddlewares, CreateWithRouteSpecFunction, DEFAULT_ARRAY_FORMATS, Middleware, MiddlewareChainOutput, QueryArrayFormat, QueryArrayFormats, RouteFunction, RouteSpec, SetupParams, checkRouteSpec, createWithRouteSpec, wrappers };
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
27
27
|
var src_exports = {};
|
|
28
28
|
__export(src_exports, {
|
|
29
29
|
BadRequestException: () => BadRequestException,
|
|
30
|
+
DEFAULT_ARRAY_FORMATS: () => DEFAULT_ARRAY_FORMATS,
|
|
30
31
|
HttpException: () => HttpException,
|
|
31
32
|
InternalServerErrorException: () => InternalServerErrorException,
|
|
32
33
|
MethodNotAllowedException: () => MethodNotAllowedException,
|
|
@@ -216,33 +217,44 @@ var getZodDefFromZodSchemaHelpers = (schema) => {
|
|
|
216
217
|
}
|
|
217
218
|
return schema._def;
|
|
218
219
|
};
|
|
219
|
-
var
|
|
220
|
-
const parsed_input = Object.assign({}, input);
|
|
220
|
+
var tryGetZodSchemaAsObject = (schema) => {
|
|
221
221
|
const isZodEffect = schema._def.typeName === import_zod.ZodFirstPartyTypeKind.ZodEffects;
|
|
222
222
|
const safe_schema = getZodObjectSchemaFromZodEffectSchema(isZodEffect, schema);
|
|
223
223
|
const isZodObject = safe_schema._def.typeName === import_zod.ZodFirstPartyTypeKind.ZodObject;
|
|
224
|
-
if (isZodObject) {
|
|
225
|
-
|
|
224
|
+
if (!isZodObject) {
|
|
225
|
+
return void 0;
|
|
226
|
+
}
|
|
227
|
+
return safe_schema;
|
|
228
|
+
};
|
|
229
|
+
var isZodSchemaArray = (schema) => {
|
|
230
|
+
const def = getZodDefFromZodSchemaHelpers(schema);
|
|
231
|
+
return def.typeName === import_zod.ZodFirstPartyTypeKind.ZodArray;
|
|
232
|
+
};
|
|
233
|
+
var isZodSchemaBoolean = (schema) => {
|
|
234
|
+
const def = getZodDefFromZodSchemaHelpers(schema);
|
|
235
|
+
return def.typeName === import_zod.ZodFirstPartyTypeKind.ZodBoolean;
|
|
236
|
+
};
|
|
237
|
+
var parseQueryParams = (schema, input, supportedArrayFormats) => {
|
|
238
|
+
const parsed_input = Object.assign({}, input);
|
|
239
|
+
const obj_schema = tryGetZodSchemaAsObject(schema);
|
|
240
|
+
if (obj_schema) {
|
|
226
241
|
for (const [key, value] of Object.entries(obj_schema.shape)) {
|
|
227
|
-
|
|
228
|
-
const isArray = def.typeName === import_zod.ZodFirstPartyTypeKind.ZodArray;
|
|
229
|
-
if (isArray) {
|
|
242
|
+
if (isZodSchemaArray(value)) {
|
|
230
243
|
const array_input = input[key];
|
|
231
|
-
if (typeof array_input === "string") {
|
|
244
|
+
if (typeof array_input === "string" && supportedArrayFormats.includes("comma")) {
|
|
232
245
|
parsed_input[key] = array_input.split(",");
|
|
233
246
|
}
|
|
234
247
|
const bracket_syntax_array_input = input[`${key}[]`];
|
|
235
|
-
if (typeof bracket_syntax_array_input === "string") {
|
|
248
|
+
if (typeof bracket_syntax_array_input === "string" && supportedArrayFormats.includes("brackets")) {
|
|
236
249
|
const pre_split_array = bracket_syntax_array_input;
|
|
237
250
|
parsed_input[key] = pre_split_array.split(",");
|
|
238
251
|
}
|
|
239
|
-
if (Array.isArray(bracket_syntax_array_input)) {
|
|
252
|
+
if (Array.isArray(bracket_syntax_array_input) && supportedArrayFormats.includes("brackets")) {
|
|
240
253
|
parsed_input[key] = bracket_syntax_array_input;
|
|
241
254
|
}
|
|
242
255
|
continue;
|
|
243
256
|
}
|
|
244
|
-
|
|
245
|
-
if (isBoolean) {
|
|
257
|
+
if (isZodSchemaBoolean(value)) {
|
|
246
258
|
const boolean_input = input[key];
|
|
247
259
|
if (typeof boolean_input === "string") {
|
|
248
260
|
parsed_input[key] = boolean_input === "true";
|
|
@@ -252,6 +264,38 @@ var parseQueryParams = (schema, input) => {
|
|
|
252
264
|
}
|
|
253
265
|
return schema.parse(parsed_input);
|
|
254
266
|
};
|
|
267
|
+
var validateQueryParams = (inputUrl, schema, supportedArrayFormats) => {
|
|
268
|
+
const url = new URL(inputUrl, "http://dummy.com");
|
|
269
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
270
|
+
const obj_schema = tryGetZodSchemaAsObject(schema);
|
|
271
|
+
if (!obj_schema) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
for (const key of url.searchParams.keys()) {
|
|
275
|
+
for (const [schemaKey, value] of Object.entries(obj_schema.shape)) {
|
|
276
|
+
if (isZodSchemaArray(value)) {
|
|
277
|
+
if (key === `${schemaKey}[]` && !supportedArrayFormats.includes("brackets")) {
|
|
278
|
+
throw new BadRequestException({
|
|
279
|
+
type: "invalid_query_params",
|
|
280
|
+
message: `Bracket syntax not supported for query param "${schemaKey}"`
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const key_schema = obj_schema.shape[key];
|
|
286
|
+
if (key_schema) {
|
|
287
|
+
if (isZodSchemaArray(key_schema)) {
|
|
288
|
+
if (seenKeys.has(key) && !supportedArrayFormats.includes("repeat")) {
|
|
289
|
+
throw new BadRequestException({
|
|
290
|
+
type: "invalid_query_params",
|
|
291
|
+
message: `Repeated parameters not supported for duplicate query param "${key}"`
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
seenKeys.add(key);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
255
299
|
var zodIssueToString = (issue) => {
|
|
256
300
|
if (issue.path.join(".") === "") {
|
|
257
301
|
return issue.message;
|
|
@@ -283,6 +327,7 @@ function validateJsonResponse(jsonResponse, res) {
|
|
|
283
327
|
}
|
|
284
328
|
var withValidation = (input) => (next) => async (req, res) => {
|
|
285
329
|
var _a, _b, _c, _d;
|
|
330
|
+
const { supportedArrayFormats = DEFAULT_ARRAY_FORMATS } = input;
|
|
286
331
|
if (input.formData && input.jsonBody || input.formData && input.commonParams) {
|
|
287
332
|
throw new Error("Cannot use formData with jsonBody or commonParams");
|
|
288
333
|
}
|
|
@@ -311,16 +356,28 @@ var withValidation = (input) => (next) => async (req, res) => {
|
|
|
311
356
|
req.body = (_d = input.jsonBody) == null ? void 0 : _d.parse(req.body);
|
|
312
357
|
}
|
|
313
358
|
if (input.queryParams) {
|
|
314
|
-
|
|
359
|
+
if (!req.url) {
|
|
360
|
+
throw new Error("req.url is undefined");
|
|
361
|
+
}
|
|
362
|
+
validateQueryParams(req.url, input.queryParams, supportedArrayFormats);
|
|
363
|
+
req.query = parseQueryParams(
|
|
364
|
+
input.queryParams,
|
|
365
|
+
req.query,
|
|
366
|
+
supportedArrayFormats
|
|
367
|
+
);
|
|
315
368
|
}
|
|
316
369
|
if (input.commonParams) {
|
|
317
370
|
;
|
|
318
371
|
req.commonParams = parseQueryParams(
|
|
319
372
|
input.commonParams,
|
|
320
|
-
original_combined_params
|
|
373
|
+
original_combined_params,
|
|
374
|
+
supportedArrayFormats
|
|
321
375
|
);
|
|
322
376
|
}
|
|
323
377
|
} catch (error) {
|
|
378
|
+
if (error instanceof BadRequestException) {
|
|
379
|
+
throw error;
|
|
380
|
+
}
|
|
324
381
|
if (error.name === "ZodError") {
|
|
325
382
|
let message;
|
|
326
383
|
if (error.issues.length === 1) {
|
|
@@ -354,6 +411,11 @@ var with_validation_default = withValidation;
|
|
|
354
411
|
// src/with-route-spec/index.ts
|
|
355
412
|
var import_zod2 = require("zod");
|
|
356
413
|
var checkRouteSpec = (spec) => spec;
|
|
414
|
+
var DEFAULT_ARRAY_FORMATS = [
|
|
415
|
+
"brackets",
|
|
416
|
+
"comma",
|
|
417
|
+
"repeat"
|
|
418
|
+
];
|
|
357
419
|
var createWithRouteSpec = (setupParams) => {
|
|
358
420
|
const {
|
|
359
421
|
authMiddlewareMap = {},
|
|
@@ -373,7 +435,8 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
373
435
|
}),
|
|
374
436
|
globalSchemas = setupParams.addOkStatus ? {
|
|
375
437
|
ok: import_zod2.z.boolean()
|
|
376
|
-
} : {}
|
|
438
|
+
} : {},
|
|
439
|
+
supportedArrayFormats = DEFAULT_ARRAY_FORMATS
|
|
377
440
|
} = setupParams;
|
|
378
441
|
const withRouteSpec = (spec) => {
|
|
379
442
|
const createRouteExport = (userDefinedRouteFn) => {
|
|
@@ -395,7 +458,8 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
395
458
|
formData: spec.formData,
|
|
396
459
|
jsonResponse: spec.jsonResponse,
|
|
397
460
|
shouldValidateResponses,
|
|
398
|
-
shouldValidateGetRequestBody
|
|
461
|
+
shouldValidateGetRequestBody,
|
|
462
|
+
supportedArrayFormats
|
|
399
463
|
}),
|
|
400
464
|
userDefinedRouteFn
|
|
401
465
|
)(req, res);
|
|
@@ -414,6 +478,7 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
414
478
|
// Annotate the CommonJS export names for ESM import in node:
|
|
415
479
|
0 && (module.exports = {
|
|
416
480
|
BadRequestException,
|
|
481
|
+
DEFAULT_ARRAY_FORMATS,
|
|
417
482
|
HttpException,
|
|
418
483
|
InternalServerErrorException,
|
|
419
484
|
MethodNotAllowedException,
|
|
@@ -424,4 +489,4 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
424
489
|
withExceptionHandling,
|
|
425
490
|
wrappers
|
|
426
491
|
});
|
|
427
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmUvaHR0cC1leGNlcHRpb25zLnRzIiwgIi4uL3NyYy9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmUvd2l0aC1leGNlcHRpb24taGFuZGxpbmcudHMiLCAiLi4vc3JjL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZS93aXRoLW9rLXN0YXR1cy50cyIsICIuLi9zcmMvbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlL2luZGV4LnRzIiwgIi4uL3NyYy93cmFwcGVycy9pbmRleC50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL21pZGRsZXdhcmVzL3dpdGgtbWV0aG9kcy50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL21pZGRsZXdhcmVzL3dpdGgtdmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2l0aC1yb3V0ZS1zcGVjXCJcbmV4cG9ydCB7IHdyYXBwZXJzIH0gZnJvbSBcIi4vd3JhcHBlcnNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIlxuIiwgImV4cG9ydCB0eXBlIEh0dHBFeGNlcHRpb25NZXRhZGF0YSA9IHtcbiAgdHlwZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgaW50ZXJmYWNlIFRocm93aW5nT3B0aW9ucyB7XG4gIGpzb24/OiBib29sZWFuXG59XG5cbi8qKlxuICogVGhyb3cgSHR0cEV4Y2VwdGlvbnMgaW5zaWRlIEFQSSBlbmRwb2ludHMgdG8gZ2VuZXJhdGUgbmljZSBlcnJvciBtZXNzYWdlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGlmIChiYWRfc291cHMuaW5jbHVkZXMoc291cF9wYXJhbSkpIHtcbiAqICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oNDAwLCB7XG4gKiAgICAgIHR5cGU6IFwiY2FudF9tYWtlX3NvdXBcIixcbiAqICAgICAgbWVzc2FnZTogXCJTb3VwIHdhcyB0b28gZGlmZmljdWx0LCBwbGVhc2Ugc3BlY2lmeSBhIGRpZmZlcmVudCBzb3VwXCJcbiAqICAgIH0pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiovXG5leHBvcnQgY2xhc3MgSHR0cEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgb3B0aW9uczogVGhyb3dpbmdPcHRpb25zXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXR1czogbnVtYmVyLFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIobWV0YWRhdGEubWVzc2FnZSlcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3RvcilcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID8/IHsganNvbjogdHJ1ZSB9XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEh0dHBFeGNlcHRpb246ICR7dGhpcy5zdGF0dXN9LCAke3RoaXMubWV0YWRhdGEubWVzc2FnZX0gKCR7dGhpcy5tZXRhZGF0YS50eXBlfSlgXG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGluc2lkZSBBUEkgZW5kcG9pbnRzIHRoYXQgd2VyZSBwcm92aWRlZCBpbmNvcnJlY3RcbiAqIHBhcmFtZXRlcnMgb3IgYm9keVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGlmIChiYWRfc291cHMuaW5jbHVkZXMoc291cF9wYXJhbSkpIHtcbiAqICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICogICAgIHR5cGU6IFwiY2FudF9tYWtlX3NvdXBcIixcbiAqICAgICBtZXNzYWdlOiBcIlNvdXAgd2FzIHRvbyBkaWZmaWN1bHQsIHBsZWFzZSBzcGVjaWZ5IGEgZGlmZmVyZW50IHNvdXBcIixcbiAqICAgfSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqKi9cbmV4cG9ydCBjbGFzcyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDAwLCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hdXRob3JpemVkRXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDAxLCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBIdHRwRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1ldGFkYXRhOiBIdHRwRXhjZXB0aW9uTWV0YWRhdGEsXG4gICAgb3B0aW9ucz86IFRocm93aW5nT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcig0MDQsIG1ldGFkYXRhLCBvcHRpb25zKVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDA1LCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiBleHRlbmRzIEh0dHBFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWV0YWRhdGE6IEh0dHBFeGNlcHRpb25NZXRhZGF0YSxcbiAgICBvcHRpb25zPzogVGhyb3dpbmdPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKDUwMCwgbWV0YWRhdGEsIG9wdGlvbnMpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVxdWVzdCwgTmV4dEFwaVJlc3BvbnNlIH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgSHR0cEV4Y2VwdGlvbiB9IGZyb20gXCIuL2h0dHAtZXhjZXB0aW9uc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyB7XG4gIGdldEVycm9yQ29udGV4dD86IChcbiAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgIGVycm9yOiBFcnJvclxuICApID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmNvbnN0IHdpdGhFeGNlcHRpb25IYW5kbGluZyA9XG4gIChvcHRpb25zOiBXaXRoRXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zID0ge30pID0+XG4gIChuZXh0OiAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD4pID0+XG4gIGFzeW5jIChyZXE6IE5leHRBcGlSZXF1ZXN0LCByZXM6IE5leHRBcGlSZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXh0KHJlcSwgcmVzKVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsZXQgZXJyb3JDb250ZXh0OiBhbnkgPSB7fVxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBlcnJvckNvbnRleHQuc3RhY2sgPSBlcnJvci5zdGFja1xuICAgICAgfVxuXG4gICAgICBlcnJvckNvbnRleHQgPSBvcHRpb25zLmdldEVycm9yQ29udGV4dFxuICAgICAgICA/IG9wdGlvbnMuZ2V0RXJyb3JDb250ZXh0KHJlcSwgZXJyb3JDb250ZXh0KVxuICAgICAgICA6IGVycm9yQ29udGV4dFxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChlcnJvci5vcHRpb25zLmpzb24pIHtcbiAgICAgICAgICByZXMuc3RhdHVzKGVycm9yLnN0YXR1cykuanNvbih7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAuLi5lcnJvci5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgLi4uZXJyb3JDb250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5zdGF0dXMoZXJyb3Iuc3RhdHVzKS5lbmQoZXJyb3IubWV0YWRhdGEubWVzc2FnZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBuZXcgSHR0cEV4Y2VwdGlvbig1MDAsIHtcbiAgICAgICAgICB0eXBlOiBcImludGVybmFsX3NlcnZlcl9lcnJvclwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAuLi5mb3JtYXR0ZWRFcnJvci5tZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmVycm9yQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aEV4Y2VwdGlvbkhhbmRsaW5nXG4iLCAiaW1wb3J0IHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcblxuZXhwb3J0IGludGVyZmFjZSBXaXRoT2tTdGF0dXNPcHRpb25zIHtcbiAgYWRkSWY/OiAocmVxOiBOZXh0QXBpUmVxdWVzdCkgPT4gYm9vbGVhblxufVxuXG5jb25zdCB3aXRoT2tTdGF0dXMgPVxuICAob3B0aW9uczogV2l0aE9rU3RhdHVzT3B0aW9ucyA9IHt9KSA9PlxuICAobmV4dDogKHJlcTogTmV4dEFwaVJlcXVlc3QsIHJlczogTmV4dEFwaVJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICAvLyBQYXRjaCAuanNvbigpXG4gICAgY29uc3Qgb3JpZ2luYWxKc29uID0gcmVzLmpzb25cblxuICAgIHJlcy5qc29uID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGNvbnN0IG9rID0gcmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwXG4gICAgICBjb25zdCBzaG91bGRJbmNsdWRlU3RhdHVzID0gb3B0aW9ucy5hZGRJZiA/IG9wdGlvbnMuYWRkSWYocmVxKSA6IHRydWVcblxuICAgICAgaWYgKHNob3VsZEluY2x1ZGVTdGF0dXMpIHtcbiAgICAgICAgb3JpZ2luYWxKc29uLmNhbGwodGhpcywge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgb2ssXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbEpzb24uY2FsbCh0aGlzLCBkYXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5leHQocmVxLCByZXMpXG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aE9rU3RhdHVzXG4iLCAiaW1wb3J0IHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB1bndyYXBwZWRXaXRoRXhjZXB0aW9uSGFuZGxpbmcsIHtcbiAgV2l0aEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyxcbn0gZnJvbSBcIi4vd2l0aC1leGNlcHRpb24taGFuZGxpbmdcIlxuaW1wb3J0IHdpdGhPa1N0YXR1cywgeyBXaXRoT2tTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4vd2l0aC1vay1zdGF0dXNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyB7XG4gIGFkZE9rU3RhdHVzPzogYm9vbGVhblxuICBva1N0YXR1c09wdGlvbnM/OiBXaXRoT2tTdGF0dXNPcHRpb25zXG4gIGV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucz86IFdpdGhFeGNlcHRpb25IYW5kbGluZ09wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhFeGNlcHRpb25IYW5kbGluZyA9XG4gICh7XG4gICAgYWRkT2tTdGF0dXMgPSBmYWxzZSxcbiAgICBva1N0YXR1c09wdGlvbnMsXG4gICAgZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zLFxuICB9OiBFeGNlcHRpb25IYW5kbGluZ09wdGlvbnMgPSB7fSkgPT5cbiAgKG5leHQ6IChyZXE6IE5leHRBcGlSZXF1ZXN0LCByZXM6IE5leHRBcGlSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPikgPT5cbiAgKHJlcTogTmV4dEFwaVJlcXVlc3QsIHJlczogTmV4dEFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKGFkZE9rU3RhdHVzKSB7XG4gICAgICByZXR1cm4gd2l0aE9rU3RhdHVzKG9rU3RhdHVzT3B0aW9ucykoXG4gICAgICAgIHVud3JhcHBlZFdpdGhFeGNlcHRpb25IYW5kbGluZyhleGNlcHRpb25IYW5kbGluZ09wdGlvbnMpKG5leHQpXG4gICAgICApKHJlcSwgcmVzKVxuICAgIH1cblxuICAgIHJldHVybiB1bndyYXBwZWRXaXRoRXhjZXB0aW9uSGFuZGxpbmcoZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zKShuZXh0KShcbiAgICAgIHJlcSxcbiAgICAgIHJlc1xuICAgIClcbiAgfVxuXG5leHBvcnQgKiBmcm9tIFwiLi9odHRwLWV4Y2VwdGlvbnNcIlxuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QgYXMgUmVxLCBOZXh0QXBpUmVzcG9uc2UgYXMgUmVzIH0gZnJvbSBcIm5leHRcIlxuLypcblxuV3JhcHMgYSBmdW5jdGlvbiBpbiBsYXllcnMgb2Ygb3RoZXIgZnVuY3Rpb25zLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBpbnB1dC9vdXRwdXRcbnR5cGUuIFRoZSBvdXRwdXQgb2Ygd3JhcHBlcnMgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdHlwZSBvZiBpdCdzIGxhc3QgcGFyYW1ldGVyXG4odGhlIHdyYXBwZWQgZnVuY3Rpb24pXG5cblRoaXMgZnVuY3Rpb24gdHVybnMgdGhpcyB0eXBlIG9mIGNvbXBvc2l0aW9uLi4uXG5cbmxvZ2dlci53aXRoQ29udGV4dChcInNvbWVjb250ZXh0XCIpKFxuICBhc3luYyAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhXG4gIH1cbilcblxuSW50by4uLlxuXG53cmFwcGVycyhcbiAgbG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIiksXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5IYXZpbmcgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kIGhlbHBzIHByZXNlcnZlIHR5cGVzLCB3aGljaCBvdGhlcndpc2UgY2FuIGdldFxubWVzc2VkIHVwIGJ5IHRoZSBtaWRkbGV3YXJlcy4gSXQgYWxzbyBjYW4gbWFrZSB0aGUgY29kZSBjbGVhbmVyIHdoZXJlIHRoZXJlIGFyZVxubXVsdGlwbGUgd3JhcHBlcnMuXG5cbiMjIEVYQU1QTEVTXG5cbkluIHRoZSBjb250ZXh0IG9mIHJlcXVlc3QgbWlkZGxld2FyZSB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcy4uLlxuXG5jb25zdCB3aXRoUmVxdWVzdExvZ2dpbmdNaWRkbGV3YXJlID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICBjb25zb2xlLmxvZyhgR09UIFJFUVVFU1QgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofWApXG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIHdyYXBwZXIgdGhhdCB0YWtlcyBzb21lIHBhcmFtZXRlcnMuLi5cblxuY29uc3Qgd2l0aExvZ2dlZEFyZ3VtZW50cyA9XG4gICAgKGxvZ1ByZWZpeDogc3RyaW5nKSA9PlxuICAgIChuZXh0KSA9PlxuICAgIGFzeW5jICguLi5mdW5jQXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2cobG9nUHJlZml4LCAuLi5mdW5jQXJncylcbiAgICAgIHJldHVybiBuZXh0KC4uLmZ1bmNBcmdzKVxuICAgIH1cblxuKi9cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZTxULCBEZXAgPSB7fT4gPSAoXG4gIG5leHQ6IChyZXE6IFJlcSAmIERlcCAmIFQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuXG4vLyBTYWZlciBNaWRkbGV3YXJlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgZXh0ZW5kUmVxdWVzdCB0byBlbnN1cmUgdGhhdCB0aGVcbi8vIG5ldyBjb250ZXh0IChUKSB3YXMgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHJlcXVlc3QuIEl0J3Mga2luZCBvZiBhbm5veWluZ1xuLy8gdG8gdXNlIGluIHByYWN0aWNlLCBzbyB3ZSBkb24ndCB1c2UgaXQgZm9yIG91ciBXcmFwcGVycyAoeWV0KVxuZXhwb3J0IHR5cGUgU2FmZXJNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAsIHJlczogUmVzKSA9PiBhbnlcblxuZXhwb3J0IGNvbnN0IGV4dGVuZFJlcXVlc3QgPSA8VCBleHRlbmRzIFJlcSwgSyBleHRlbmRzIHt9PihcbiAgcmVxOiBULFxuICBtZXJnZTogS1xuKTogVCAmIEsgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlKSkge1xuICAgIDsocmVxIGFzIGFueSlba2V5XSA9IHZcbiAgfVxuICByZXR1cm4gcmVxIGFzIGFueVxufVxuXG50eXBlIFdyYXBwZXJzMSA9IDxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnMyID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgZW5kcG9pbnQ6IChyZXE6IFJlcSAmIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFRPRE8gZmlndXJlIG91dCBob3cgdG8gZG8gYSByZWN1cnNpdmUgZGVmaW5pdGlvbiwgb3Igb25lIHRoYXQgc2ltcGxpZmllc1xuLy8gdGhlc2UgcmVkdW5kYW50IHdyYXBwZXJzXG5cbnR5cGUgV3JhcHBlcnMzID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNCA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczUgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczYgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXAsXG4gIE13NlJlcXVlc3RDb250ZXh0LFxuICBNdzZEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc2OiBNaWRkbGV3YXJlPFxuICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc2RGVwXG4gICAgICA/IE13NkRlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNyA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcCxcbiAgTXc3UmVxdWVzdENvbnRleHQsXG4gIE13N0RlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NzogTWlkZGxld2FyZTxcbiAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13N0RlcFxuICAgICAgPyBNdzdEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVycyA9IFdyYXBwZXJzMSAmXG4gIFdyYXBwZXJzMiAmXG4gIFdyYXBwZXJzMyAmXG4gIFdyYXBwZXJzNCAmXG4gIFdyYXBwZXJzNSAmXG4gIFdyYXBwZXJzNiAmXG4gIFdyYXBwZXJzN1xuXG5leHBvcnQgY29uc3Qgd3JhcHBlcnM6IFdyYXBwZXJzID0gKC4uLndyYXBwZXJzQXJnczogYW55W10pID0+IHtcbiAgY29uc3Qgd3JhcHBlZEZ1bmN0aW9uID0gd3JhcHBlcnNBcmdzW3dyYXBwZXJzQXJncy5sZW5ndGggLSAxXVxuICBjb25zdCBtd3MgPSB3cmFwcGVyc0FyZ3Muc2xpY2UoMCwgLTEpXG5cbiAgbGV0IGxhc3RXcmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVkRnVuY3Rpb25cbiAgZm9yIChsZXQgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxhc3RXcmFwcGVkRnVuY3Rpb24gPSAobXdzW2ldIGFzIGFueSkobGFzdFdyYXBwZWRGdW5jdGlvbilcbiAgfVxuXG4gIHJldHVybiBsYXN0V3JhcHBlZEZ1bmN0aW9uXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJzXG4iLCAiaW1wb3J0IHsgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5leHBvcnQgdHlwZSBIVFRQTWV0aG9kcyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG5cbmV4cG9ydCBjb25zdCB3aXRoTWV0aG9kcyA9IChtZXRob2RzOiBIVFRQTWV0aG9kc1tdKSA9PiAobmV4dCkgPT4gKHJlcSwgcmVzKSA9PiB7XG4gIGlmICghbWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKHtcbiAgICAgIHR5cGU6IFwibWV0aG9kX25vdF9hbGxvd2VkXCIsXG4gICAgICBtZXNzYWdlOiBgb25seSAke21ldGhvZHMuam9pbihcIixcIil9IGFjY2VwdGVkYCxcbiAgICB9KVxuICB9XG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoTWV0aG9kc1xuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHosIFpvZEZpcnN0UGFydHlUeXBlS2luZCB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5jb25zdCBnZXRab2RPYmplY3RTY2hlbWFGcm9tWm9kRWZmZWN0U2NoZW1hID0gKFxuICBpc1pvZEVmZmVjdDogYm9vbGVhbixcbiAgc2NoZW1hOiB6LlpvZFR5cGVBbnlcbik6IHouWm9kVHlwZUFueSB8IHouWm9kT2JqZWN0PGFueT4gPT4ge1xuICBpZiAoIWlzWm9kRWZmZWN0KSB7XG4gICAgcmV0dXJuIHNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG4gIH1cblxuICBsZXQgY3VycmVudFNjaGVtYSA9IHNjaGVtYVxuXG4gIHdoaWxlIChjdXJyZW50U2NoZW1hIGluc3RhbmNlb2Ygei5ab2RFZmZlY3RzKSB7XG4gICAgY3VycmVudFNjaGVtYSA9IGN1cnJlbnRTY2hlbWEuX2RlZi5zY2hlbWFcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50U2NoZW1hIGFzIHouWm9kT2JqZWN0PGFueT5cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHNjaGVtYSBmcm9tIGEgWm9kRWZmZWN0IHwgWm9kRGVmYXVsdCB8IFpvZE9wdGlvbmFsIHNjaGVtYS5cbiAqIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhbmRsZSBhbGwgc3BlY2lhbCBjYXNlcyBvZiBab2RTY2hlbWEgYW5kIG5vdCBqdXN0IFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbFxuICovXG5jb25zdCBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCBzcGVjaWFsX3pvZF90eXBlcyA9IFtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gIF1cblxuICB3aGlsZSAoc3BlY2lhbF96b2RfdHlwZXMuaW5jbHVkZXMoc2NoZW1hLl9kZWYudHlwZU5hbWUpKSB7XG4gICAgaWYgKFxuICAgICAgc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCB8fFxuICAgICAgc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0XG4gICAgKSB7XG4gICAgICBzY2hlbWEgPSBzY2hlbWEuX2RlZi5pbm5lclR5cGVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cykge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuc2NoZW1hXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2NoZW1hLl9kZWZcbn1cblxuY29uc3QgcGFyc2VRdWVyeVBhcmFtcyA9IChcbiAgc2NoZW1hOiB6LlpvZFR5cGVBbnksXG4gIGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKSA9PiB7XG4gIGNvbnN0IHBhcnNlZF9pbnB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KVxuICBjb25zdCBpc1pvZEVmZmVjdCA9IHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICBjb25zdCBzYWZlX3NjaGVtYSA9IGdldFpvZE9iamVjdFNjaGVtYUZyb21ab2RFZmZlY3RTY2hlbWEoaXNab2RFZmZlY3QsIHNjaGVtYSlcbiAgY29uc3QgaXNab2RPYmplY3QgPVxuICAgIHNhZmVfc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3RcblxuICBpZiAoaXNab2RPYmplY3QpIHtcbiAgICBjb25zdCBvYmpfc2NoZW1hID0gc2FmZV9zY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGNvbnN0IGRlZiA9IGdldFpvZERlZkZyb21ab2RTY2hlbWFIZWxwZXJzKHZhbHVlIGFzIHouWm9kVHlwZUFueSlcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBkZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheVxuICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgY29uc3QgYXJyYXlfaW5wdXQgPSBpbnB1dFtrZXldXG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheV9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYXJyYXlfaW5wdXQuc3BsaXQoXCIsXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dCA9IGlucHV0W2Ake2tleX1bXWBdXG4gICAgICAgIGlmICh0eXBlb2YgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBwcmVfc3BsaXRfYXJyYXkgPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gcHJlX3NwbGl0X2FycmF5LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQpKSB7XG4gICAgICAgICAgcGFyc2VkX2lucHV0W2tleV0gPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNCb29sZWFuID0gZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhblxuICAgICAgaWYgKGlzQm9vbGVhbikge1xuICAgICAgICBjb25zdCBib29sZWFuX2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYm9vbGVhbl9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYm9vbGVhbl9pbnB1dCA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY2hlbWEucGFyc2UocGFyc2VkX2lucHV0KVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnB1dDxcbiAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbj4ge1xuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxufVxuXG5jb25zdCB6b2RJc3N1ZVRvU3RyaW5nID0gKGlzc3VlOiB6LlpvZElzc3VlKSA9PiB7XG4gIGlmIChpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2VcbiAgfVxuICBpZiAoaXNzdWUubWVzc2FnZSA9PT0gXCJSZXF1aXJlZFwiKSB7XG4gICAgcmV0dXJuIGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9IGlzIHJlcXVpcmVkYFxuICB9XG4gIHJldHVybiBgJHtpc3N1ZS5tZXNzYWdlfSBmb3IgXCIke2lzc3VlLnBhdGguam9pbihcIi5cIil9XCJgXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSnNvblJlc3BvbnNlPEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueT4oXG4gIGpzb25SZXNwb25zZTogSnNvblJlc3BvbnNlIHwgdW5kZWZpbmVkLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVxuKSB7XG4gIGNvbnN0IG9yaWdpbmFsX3Jlc19qc29uID0gcmVzLmpzb25cbiAgY29uc3Qgb3ZlcnJpZGVfcmVzX2pzb24gPSAoanNvbjogYW55KSA9PiB7XG4gICAgY29uc3QgaXNfc3VjY2VzcyA9IHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMFxuICAgIGlmICghaXNfc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGpzb25SZXNwb25zZT8ucGFyc2UoanNvbilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX3Jlc3BvbnNlXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHdpdGgganNvblJlc3BvbnNlXCIsXG4gICAgICAgIHpvZEVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICB9XG4gIHJlcy5qc29uID0gb3ZlcnJpZGVfcmVzX2pzb25cbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhWYWxpZGF0aW9uID1cbiAgPFxuICAgIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgPihcbiAgICBpbnB1dDogUmVxdWVzdElucHV0PFxuICAgICAgSnNvbkJvZHksXG4gICAgICBRdWVyeVBhcmFtcyxcbiAgICAgIENvbW1vblBhcmFtcyxcbiAgICAgIEZvcm1EYXRhLFxuICAgICAgSnNvblJlc3BvbnNlXG4gICAgPlxuICApID0+XG4gIChuZXh0KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICAoaW5wdXQuZm9ybURhdGEgJiYgaW5wdXQuanNvbkJvZHkpIHx8XG4gICAgICAoaW5wdXQuZm9ybURhdGEgJiYgaW5wdXQuY29tbW9uUGFyYW1zKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBmb3JtRGF0YSB3aXRoIGpzb25Cb2R5IG9yIGNvbW1vblBhcmFtc1wiKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChyZXEubWV0aG9kID09PSBcIlBPU1RcIiB8fCByZXEubWV0aG9kID09PSBcIlBBVENIXCIpICYmXG4gICAgICAoaW5wdXQuanNvbkJvZHkgfHwgaW5wdXQuY29tbW9uUGFyYW1zKSAmJlxuICAgICAgIXJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdPy5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikgJiZcbiAgICAgICFfLmlzRW1wdHkocmVxLmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYCR7cmVxLm1ldGhvZH0gcmVxdWVzdHMgbXVzdCBoYXZlIENvbnRlbnQtVHlwZSBoZWFkZXIgd2l0aCBcImFwcGxpY2F0aW9uL2pzb25cImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlucHV0LmZvcm1EYXRhICYmXG4gICAgICByZXEubWV0aG9kICE9PSBcIkdFVFwiICYmXG4gICAgICAhcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/LmluY2x1ZGVzKFxuICAgICAgICBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXG4gICAgICApXG4gICAgICAvLyBUT0RPIGV2ZW50dWFsbHkgd2Ugc2hvdWxkIHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfY29udGVudF90eXBlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBNdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJgLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxfY29tYmluZWRfcGFyYW1zID0geyAuLi5yZXEucXVlcnksIC4uLnJlcS5ib2R5IH1cblxuICAgICAgY29uc3Qgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkgPSBpbnB1dC5zaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5XG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IHJlcS5tZXRob2QgIT09IFwiR0VUXCJcblxuICAgICAgY29uc3QgaXNGb3JtRGF0YSA9IEJvb2xlYW4oaW5wdXQuZm9ybURhdGEpXG5cbiAgICAgIGlmIChpc0Zvcm1EYXRhICYmIHdpbGxWYWxpZGF0ZVJlcXVlc3RCb2R5KSB7XG4gICAgICAgIHJlcS5ib2R5ID0gaW5wdXQuZm9ybURhdGE/LnBhcnNlKHJlcS5ib2R5KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5qc29uQm9keT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5xdWVyeVBhcmFtcykge1xuICAgICAgICByZXEucXVlcnkgPSBwYXJzZVF1ZXJ5UGFyYW1zKGlucHV0LnF1ZXJ5UGFyYW1zLCByZXEucXVlcnkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFzIGNvbW1vblBhcmFtcyBpbmNsdWRlcyBxdWVyeSBwYXJhbXMsIHdlIGNhbiB1c2UgdGhlIHBhcnNlUXVlcnlQYXJhbXMgZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIDsocmVxIGFzIGFueSkuY29tbW9uUGFyYW1zID0gcGFyc2VRdWVyeVBhcmFtcyhcbiAgICAgICAgICBpbnB1dC5jb21tb25QYXJhbXMsXG4gICAgICAgICAgb3JpZ2luYWxfY29tYmluZWRfcGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gXCJab2RFcnJvclwiKSB7XG4gICAgICAgIGxldCBtZXNzYWdlXG4gICAgICAgIGlmIChlcnJvci5pc3N1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgaXNzdWUgPSBlcnJvci5pc3N1ZXNbMF1cbiAgICAgICAgICBtZXNzYWdlID0gem9kSXNzdWVUb1N0cmluZyhpc3N1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlX2NvbXBvbmVudHM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLnB1c2goem9kSXNzdWVUb1N0cmluZyhpc3N1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgYCR7ZXJyb3IuaXNzdWVzLmxlbmd0aH0gSW5wdXQgRXJyb3JzOiBgICtcbiAgICAgICAgICAgIG1lc3NhZ2VfY29tcG9uZW50cy5qb2luKFwiLCBcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICB0eXBlOiBcImludmFsaWRfaW5wdXRcIixcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3JzOiBlcnJvci5mb3JtYXQoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfaW5wdXRcIixcbiAgICAgICAgbWVzc2FnZTogXCJFcnJvciB3aGlsZSBwYXJzaW5nIGlucHV0XCIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgd2lsbCBvdmVycmlkZSB0aGUgcmVzLmpzb24gbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSByZXNwb25zZVxuICAgICAqL1xuICAgIGlmIChpbnB1dC5zaG91bGRWYWxpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgdmFsaWRhdGVKc29uUmVzcG9uc2UoaW5wdXQuanNvblJlc3BvbnNlLCByZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQocmVxLCByZXMpXG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFZhbGlkYXRpb25cbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVzcG9uc2UsIE5leHRBcGlSZXF1ZXN0IH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgd2l0aEV4Y2VwdGlvbkhhbmRsaW5nIH0gZnJvbSBcIi4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5pbXBvcnQgd3JhcHBlcnMsIHsgTWlkZGxld2FyZSB9IGZyb20gXCIuLi93cmFwcGVyc1wiXG5pbXBvcnQgeyBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24sIFJvdXRlU3BlYyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgd2l0aE1ldGhvZHMsIHsgSFRUUE1ldGhvZHMgfSBmcm9tIFwiLi9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHNcIlxuaW1wb3J0IHdpdGhWYWxpZGF0aW9uIGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtdmFsaWRhdGlvblwiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5cbnR5cGUgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnkgfCB6LlpvZEVmZmVjdHM8ei5ab2RUeXBlQW55PlxuXG5leHBvcnQgY29uc3QgY2hlY2tSb3V0ZVNwZWMgPSA8XG4gIEF1dGhUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBNZXRob2RzIGV4dGVuZHMgSFRUUE1ldGhvZHNbXSA9IEhUVFBNZXRob2RzW10sXG4gIEpzb25Cb2R5IGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIENvbW1vblBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBNaWRkbGV3YXJlcyBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmU8YW55LCBhbnk+W10gPSByZWFkb25seSBNaWRkbGV3YXJlPFxuICAgIGFueSxcbiAgICBhbnlcbiAgPltdLFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBTcGVjIGV4dGVuZHMgUm91dGVTcGVjPFxuICAgIEF1dGhUeXBlLFxuICAgIE1ldGhvZHMsXG4gICAgSnNvbkJvZHksXG4gICAgUXVlcnlQYXJhbXMsXG4gICAgQ29tbW9uUGFyYW1zLFxuICAgIE1pZGRsZXdhcmVzLFxuICAgIEZvcm1EYXRhXG4gID4gPSBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPlxuPihcbiAgc3BlYzogU3BlY1xuKTogc3RyaW5nIGV4dGVuZHMgU3BlY1tcImF1dGhcIl1cbiAgPyBgeW91ciByb3V0ZSBzcGVjIGlzIHVuZGVyc3BlY2lmaWVkLCBhZGQgXCJhcyBjb25zdFwiYFxuICA6IFNwZWMgPT4gc3BlYyBhcyBhbnlcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdpdGhSb3V0ZVNwZWM6IENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbiA9ICgoXG4gIHNldHVwUGFyYW1zXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGF1dGhNaWRkbGV3YXJlTWFwID0ge30sXG4gICAgZ2xvYmFsTWlkZGxld2FyZXMgPSBbXSxcbiAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5ID0gdHJ1ZSxcbiAgICBleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmUgPSB3aXRoRXhjZXB0aW9uSGFuZGxpbmcoe1xuICAgICAgYWRkT2tTdGF0dXM6IHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzLFxuICAgICAgZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zOiB7XG4gICAgICAgIGdldEVycm9yQ29udGV4dDogKHJlcSwgZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXJyb3JcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55LFxuICAgIGdsb2JhbFNjaGVtYXMgPSBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1c1xuICAgICAgPyB7XG4gICAgICAgICAgb2s6IHouYm9vbGVhbigpLFxuICAgICAgICB9XG4gICAgICA6IHt9LFxuICB9ID0gc2V0dXBQYXJhbXNcblxuICBjb25zdCB3aXRoUm91dGVTcGVjID0gKHNwZWM6IFJvdXRlU3BlYykgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZVJvdXRlRXhwb3J0ID0gKHVzZXJEZWZpbmVkUm91dGVGbikgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlcXVlc3RIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgICAgICByZXM6IE5leHRBcGlSZXNwb25zZVxuICAgICAgKSA9PiB7XG4gICAgICAgIGF1dGhNaWRkbGV3YXJlTWFwW1wibm9uZVwiXSA9IChuZXh0KSA9PiBuZXh0XG5cbiAgICAgICAgY29uc3QgYXV0aF9taWRkbGV3YXJlID0gYXV0aE1pZGRsZXdhcmVNYXBbc3BlYy5hdXRoXVxuICAgICAgICBpZiAoIWF1dGhfbWlkZGxld2FyZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF1dGggdHlwZTogJHtzcGVjLmF1dGh9YClcblxuICAgICAgICByZXR1cm4gd3JhcHBlcnMoXG4gICAgICAgICAgLi4uKChleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmVcbiAgICAgICAgICAgID8gW2V4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZV1cbiAgICAgICAgICAgIDogW10pIGFzIFthbnldKSxcbiAgICAgICAgICAuLi4oKGdsb2JhbE1pZGRsZXdhcmVzIHx8IFtdKSBhcyBbXSksXG4gICAgICAgICAgYXV0aF9taWRkbGV3YXJlLFxuICAgICAgICAgIC4uLigoc3BlYy5taWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIHdpdGhNZXRob2RzKHNwZWMubWV0aG9kcyksXG4gICAgICAgICAgd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICAgICAganNvbkJvZHk6IHNwZWMuanNvbkJvZHksXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogc3BlYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGNvbW1vblBhcmFtczogc3BlYy5jb21tb25QYXJhbXMsXG4gICAgICAgICAgICBmb3JtRGF0YTogc3BlYy5mb3JtRGF0YSxcbiAgICAgICAgICAgIGpzb25SZXNwb25zZTogc3BlYy5qc29uUmVzcG9uc2UsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICAgICAgICAgIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdXNlckRlZmluZWRSb3V0ZUZuXG4gICAgICAgICkocmVxIGFzIGFueSwgcmVzKVxuICAgICAgfVxuXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgICByZXR1cm4gcm9vdFJlcXVlc3RIYW5kbGVyXG4gICAgfVxuXG4gICAgY3JlYXRlUm91dGVFeHBvcnQuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlRXhwb3J0XG4gIH1cblxuICB3aXRoUm91dGVTcGVjLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG5cbiAgcmV0dXJuIHdpdGhSb3V0ZVNwZWNcbn0pIGFzIGFueVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQUFBQTtB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OVFmLElBQUFDLGNBQWtCO0FBSVgsSUFBTSxpQkFBaUIsQ0E2QjVCLFNBR1U7QUFFTCxJQUFNLHNCQUFvRCxDQUMvRCxnQkFDRztBQUNILFFBQU07QUFBQSxJQUNKLG9CQUFvQixDQUFDO0FBQUEsSUFDckIsb0JBQW9CLENBQUM7QUFBQSxJQUNyQjtBQUFBLElBQ0EsK0JBQStCO0FBQUEsSUFDL0IsOEJBQThCQyx1QkFBc0I7QUFBQSxNQUNsRCxhQUFhLFlBQVk7QUFBQSxNQUN6QiwwQkFBMEI7QUFBQSxRQUN4QixpQkFBaUIsQ0FBQyxLQUFLLFVBQVU7QUFDL0IsY0FBSSxRQUFRLElBQUksYUFBYSxjQUFjO0FBQ3pDLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBRUEsaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsZ0JBQWdCLFlBQVksY0FDeEI7QUFBQSxNQUNFLElBQUksY0FBRSxRQUFRO0FBQUEsSUFDaEIsSUFDQSxDQUFDO0FBQUEsRUFDUCxJQUFJO0FBRUosUUFBTSxnQkFBZ0IsQ0FBQyxTQUFvQjtBQUN6QyxVQUFNLG9CQUFvQixDQUFDLHVCQUF1QjtBQUNoRCxZQUFNLHFCQUFxQixPQUN6QixLQUNBLFFBQ0c7QUFDSCwwQkFBa0IsVUFBVSxDQUFDLFNBQVM7QUFFdEMsY0FBTSxrQkFBa0Isa0JBQWtCLEtBQUs7QUFDL0MsWUFBSSxDQUFDO0FBQWlCLGdCQUFNLElBQUksTUFBTSxzQkFBc0IsS0FBSyxNQUFNO0FBRXZFLGVBQU87QUFBQSxVQUNMLEdBQUssOEJBQ0QsQ0FBQywyQkFBMkIsSUFDNUIsQ0FBQztBQUFBLFVBQ0wsR0FBSyxxQkFBcUIsQ0FBQztBQUFBLFVBQzNCO0FBQUEsVUFDQSxHQUFLLEtBQUssZUFBZSxDQUFDO0FBQUEsVUFDMUIscUJBQVksS0FBSyxPQUFPO0FBQUEsVUFDeEIsd0JBQWU7QUFBQSxZQUNiLFVBQVUsS0FBSztBQUFBLFlBQ2YsYUFBYSxLQUFLO0FBQUEsWUFDbEIsY0FBYyxLQUFLO0FBQUEsWUFDbkIsVUFBVSxLQUFLO0FBQUEsWUFDZixjQUFjLEtBQUs7QUFBQSxZQUNuQjtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFBQSxVQUNEO0FBQUEsUUFDRixFQUFFLEtBQVksR0FBRztBQUFBLE1BQ25CO0FBRUEseUJBQW1CLGVBQWU7QUFDbEMseUJBQW1CLGFBQWE7QUFFaEMsYUFBTztBQUFBLElBQ1Q7QUFFQSxzQkFBa0IsZUFBZTtBQUNqQyxzQkFBa0IsYUFBYTtBQUUvQixXQUFPO0FBQUEsRUFDVDtBQUVBLGdCQUFjLGVBQWU7QUFFN0IsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJ3aXRoRXhjZXB0aW9uSGFuZGxpbmciLCAid2l0aEV4Y2VwdGlvbkhhbmRsaW5nIiwgIl8iLCAiaW1wb3J0X3pvZCIsICJ3aXRoRXhjZXB0aW9uSGFuZGxpbmciXQp9Cg==
|
|
492
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmUvaHR0cC1leGNlcHRpb25zLnRzIiwgIi4uL3NyYy9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmUvd2l0aC1leGNlcHRpb24taGFuZGxpbmcudHMiLCAiLi4vc3JjL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZS93aXRoLW9rLXN0YXR1cy50cyIsICIuLi9zcmMvbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlL2luZGV4LnRzIiwgIi4uL3NyYy93cmFwcGVycy9pbmRleC50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL21pZGRsZXdhcmVzL3dpdGgtbWV0aG9kcy50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL21pZGRsZXdhcmVzL3dpdGgtdmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd2l0aC1yb3V0ZS1zcGVjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2l0aC1yb3V0ZS1zcGVjXCJcbmV4cG9ydCB7IHdyYXBwZXJzIH0gZnJvbSBcIi4vd3JhcHBlcnNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIlxuIiwgImV4cG9ydCB0eXBlIEh0dHBFeGNlcHRpb25NZXRhZGF0YSA9IHtcbiAgdHlwZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgaW50ZXJmYWNlIFRocm93aW5nT3B0aW9ucyB7XG4gIGpzb24/OiBib29sZWFuXG59XG5cbi8qKlxuICogVGhyb3cgSHR0cEV4Y2VwdGlvbnMgaW5zaWRlIEFQSSBlbmRwb2ludHMgdG8gZ2VuZXJhdGUgbmljZSBlcnJvciBtZXNzYWdlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGlmIChiYWRfc291cHMuaW5jbHVkZXMoc291cF9wYXJhbSkpIHtcbiAqICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oNDAwLCB7XG4gKiAgICAgIHR5cGU6IFwiY2FudF9tYWtlX3NvdXBcIixcbiAqICAgICAgbWVzc2FnZTogXCJTb3VwIHdhcyB0b28gZGlmZmljdWx0LCBwbGVhc2Ugc3BlY2lmeSBhIGRpZmZlcmVudCBzb3VwXCJcbiAqICAgIH0pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiovXG5leHBvcnQgY2xhc3MgSHR0cEV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgb3B0aW9uczogVGhyb3dpbmdPcHRpb25zXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXR1czogbnVtYmVyLFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIobWV0YWRhdGEubWVzc2FnZSlcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3RvcilcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID8/IHsganNvbjogdHJ1ZSB9XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEh0dHBFeGNlcHRpb246ICR7dGhpcy5zdGF0dXN9LCAke3RoaXMubWV0YWRhdGEubWVzc2FnZX0gKCR7dGhpcy5tZXRhZGF0YS50eXBlfSlgXG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGluc2lkZSBBUEkgZW5kcG9pbnRzIHRoYXQgd2VyZSBwcm92aWRlZCBpbmNvcnJlY3RcbiAqIHBhcmFtZXRlcnMgb3IgYm9keVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGlmIChiYWRfc291cHMuaW5jbHVkZXMoc291cF9wYXJhbSkpIHtcbiAqICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICogICAgIHR5cGU6IFwiY2FudF9tYWtlX3NvdXBcIixcbiAqICAgICBtZXNzYWdlOiBcIlNvdXAgd2FzIHRvbyBkaWZmaWN1bHQsIHBsZWFzZSBzcGVjaWZ5IGEgZGlmZmVyZW50IHNvdXBcIixcbiAqICAgfSlcbiAqIH1cbiAqIGBgYFxuICpcbiAqKi9cbmV4cG9ydCBjbGFzcyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDAwLCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hdXRob3JpemVkRXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDAxLCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBIdHRwRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1ldGFkYXRhOiBIdHRwRXhjZXB0aW9uTWV0YWRhdGEsXG4gICAgb3B0aW9ucz86IFRocm93aW5nT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcig0MDQsIG1ldGFkYXRhLCBvcHRpb25zKVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgSHR0cEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtZXRhZGF0YTogSHR0cEV4Y2VwdGlvbk1ldGFkYXRhLFxuICAgIG9wdGlvbnM/OiBUaHJvd2luZ09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoNDA1LCBtZXRhZGF0YSwgb3B0aW9ucylcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiBleHRlbmRzIEh0dHBFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWV0YWRhdGE6IEh0dHBFeGNlcHRpb25NZXRhZGF0YSxcbiAgICBvcHRpb25zPzogVGhyb3dpbmdPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKDUwMCwgbWV0YWRhdGEsIG9wdGlvbnMpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVxdWVzdCwgTmV4dEFwaVJlc3BvbnNlIH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgSHR0cEV4Y2VwdGlvbiB9IGZyb20gXCIuL2h0dHAtZXhjZXB0aW9uc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyB7XG4gIGdldEVycm9yQ29udGV4dD86IChcbiAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgIGVycm9yOiBFcnJvclxuICApID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbmNvbnN0IHdpdGhFeGNlcHRpb25IYW5kbGluZyA9XG4gIChvcHRpb25zOiBXaXRoRXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zID0ge30pID0+XG4gIChuZXh0OiAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD4pID0+XG4gIGFzeW5jIChyZXE6IE5leHRBcGlSZXF1ZXN0LCByZXM6IE5leHRBcGlSZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXh0KHJlcSwgcmVzKVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsZXQgZXJyb3JDb250ZXh0OiBhbnkgPSB7fVxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBlcnJvckNvbnRleHQuc3RhY2sgPSBlcnJvci5zdGFja1xuICAgICAgfVxuXG4gICAgICBlcnJvckNvbnRleHQgPSBvcHRpb25zLmdldEVycm9yQ29udGV4dFxuICAgICAgICA/IG9wdGlvbnMuZ2V0RXJyb3JDb250ZXh0KHJlcSwgZXJyb3JDb250ZXh0KVxuICAgICAgICA6IGVycm9yQ29udGV4dFxuXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChlcnJvci5vcHRpb25zLmpzb24pIHtcbiAgICAgICAgICByZXMuc3RhdHVzKGVycm9yLnN0YXR1cykuanNvbih7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICAuLi5lcnJvci5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgLi4uZXJyb3JDb250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcy5zdGF0dXMoZXJyb3Iuc3RhdHVzKS5lbmQoZXJyb3IubWV0YWRhdGEubWVzc2FnZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBuZXcgSHR0cEV4Y2VwdGlvbig1MDAsIHtcbiAgICAgICAgICB0eXBlOiBcImludGVybmFsX3NlcnZlcl9lcnJvclwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAuLi5mb3JtYXR0ZWRFcnJvci5tZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLmVycm9yQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aEV4Y2VwdGlvbkhhbmRsaW5nXG4iLCAiaW1wb3J0IHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcblxuZXhwb3J0IGludGVyZmFjZSBXaXRoT2tTdGF0dXNPcHRpb25zIHtcbiAgYWRkSWY/OiAocmVxOiBOZXh0QXBpUmVxdWVzdCkgPT4gYm9vbGVhblxufVxuXG5jb25zdCB3aXRoT2tTdGF0dXMgPVxuICAob3B0aW9uczogV2l0aE9rU3RhdHVzT3B0aW9ucyA9IHt9KSA9PlxuICAobmV4dDogKHJlcTogTmV4dEFwaVJlcXVlc3QsIHJlczogTmV4dEFwaVJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICAvLyBQYXRjaCAuanNvbigpXG4gICAgY29uc3Qgb3JpZ2luYWxKc29uID0gcmVzLmpzb25cblxuICAgIHJlcy5qc29uID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGNvbnN0IG9rID0gcmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwXG4gICAgICBjb25zdCBzaG91bGRJbmNsdWRlU3RhdHVzID0gb3B0aW9ucy5hZGRJZiA/IG9wdGlvbnMuYWRkSWYocmVxKSA6IHRydWVcblxuICAgICAgaWYgKHNob3VsZEluY2x1ZGVTdGF0dXMpIHtcbiAgICAgICAgb3JpZ2luYWxKc29uLmNhbGwodGhpcywge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgb2ssXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbEpzb24uY2FsbCh0aGlzLCBkYXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5leHQocmVxLCByZXMpXG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aE9rU3RhdHVzXG4iLCAiaW1wb3J0IHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB1bndyYXBwZWRXaXRoRXhjZXB0aW9uSGFuZGxpbmcsIHtcbiAgV2l0aEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyxcbn0gZnJvbSBcIi4vd2l0aC1leGNlcHRpb24taGFuZGxpbmdcIlxuaW1wb3J0IHdpdGhPa1N0YXR1cywgeyBXaXRoT2tTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4vd2l0aC1vay1zdGF0dXNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucyB7XG4gIGFkZE9rU3RhdHVzPzogYm9vbGVhblxuICBva1N0YXR1c09wdGlvbnM/OiBXaXRoT2tTdGF0dXNPcHRpb25zXG4gIGV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9ucz86IFdpdGhFeGNlcHRpb25IYW5kbGluZ09wdGlvbnNcbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhFeGNlcHRpb25IYW5kbGluZyA9XG4gICh7XG4gICAgYWRkT2tTdGF0dXMgPSBmYWxzZSxcbiAgICBva1N0YXR1c09wdGlvbnMsXG4gICAgZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zLFxuICB9OiBFeGNlcHRpb25IYW5kbGluZ09wdGlvbnMgPSB7fSkgPT5cbiAgKG5leHQ6IChyZXE6IE5leHRBcGlSZXF1ZXN0LCByZXM6IE5leHRBcGlSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPikgPT5cbiAgKHJlcTogTmV4dEFwaVJlcXVlc3QsIHJlczogTmV4dEFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKGFkZE9rU3RhdHVzKSB7XG4gICAgICByZXR1cm4gd2l0aE9rU3RhdHVzKG9rU3RhdHVzT3B0aW9ucykoXG4gICAgICAgIHVud3JhcHBlZFdpdGhFeGNlcHRpb25IYW5kbGluZyhleGNlcHRpb25IYW5kbGluZ09wdGlvbnMpKG5leHQpXG4gICAgICApKHJlcSwgcmVzKVxuICAgIH1cblxuICAgIHJldHVybiB1bndyYXBwZWRXaXRoRXhjZXB0aW9uSGFuZGxpbmcoZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zKShuZXh0KShcbiAgICAgIHJlcSxcbiAgICAgIHJlc1xuICAgIClcbiAgfVxuXG5leHBvcnQgKiBmcm9tIFwiLi9odHRwLWV4Y2VwdGlvbnNcIlxuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QgYXMgUmVxLCBOZXh0QXBpUmVzcG9uc2UgYXMgUmVzIH0gZnJvbSBcIm5leHRcIlxuLypcblxuV3JhcHMgYSBmdW5jdGlvbiBpbiBsYXllcnMgb2Ygb3RoZXIgZnVuY3Rpb25zLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBpbnB1dC9vdXRwdXRcbnR5cGUuIFRoZSBvdXRwdXQgb2Ygd3JhcHBlcnMgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdHlwZSBvZiBpdCdzIGxhc3QgcGFyYW1ldGVyXG4odGhlIHdyYXBwZWQgZnVuY3Rpb24pXG5cblRoaXMgZnVuY3Rpb24gdHVybnMgdGhpcyB0eXBlIG9mIGNvbXBvc2l0aW9uLi4uXG5cbmxvZ2dlci53aXRoQ29udGV4dChcInNvbWVjb250ZXh0XCIpKFxuICBhc3luYyAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhXG4gIH1cbilcblxuSW50by4uLlxuXG53cmFwcGVycyhcbiAgbG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIiksXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5IYXZpbmcgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kIGhlbHBzIHByZXNlcnZlIHR5cGVzLCB3aGljaCBvdGhlcndpc2UgY2FuIGdldFxubWVzc2VkIHVwIGJ5IHRoZSBtaWRkbGV3YXJlcy4gSXQgYWxzbyBjYW4gbWFrZSB0aGUgY29kZSBjbGVhbmVyIHdoZXJlIHRoZXJlIGFyZVxubXVsdGlwbGUgd3JhcHBlcnMuXG5cbiMjIEVYQU1QTEVTXG5cbkluIHRoZSBjb250ZXh0IG9mIHJlcXVlc3QgbWlkZGxld2FyZSB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcy4uLlxuXG5jb25zdCB3aXRoUmVxdWVzdExvZ2dpbmdNaWRkbGV3YXJlID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICBjb25zb2xlLmxvZyhgR09UIFJFUVVFU1QgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofWApXG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIHdyYXBwZXIgdGhhdCB0YWtlcyBzb21lIHBhcmFtZXRlcnMuLi5cblxuY29uc3Qgd2l0aExvZ2dlZEFyZ3VtZW50cyA9XG4gICAgKGxvZ1ByZWZpeDogc3RyaW5nKSA9PlxuICAgIChuZXh0KSA9PlxuICAgIGFzeW5jICguLi5mdW5jQXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2cobG9nUHJlZml4LCAuLi5mdW5jQXJncylcbiAgICAgIHJldHVybiBuZXh0KC4uLmZ1bmNBcmdzKVxuICAgIH1cblxuKi9cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZTxULCBEZXAgPSB7fT4gPSAoXG4gIG5leHQ6IChyZXE6IFJlcSAmIERlcCAmIFQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuXG4vLyBTYWZlciBNaWRkbGV3YXJlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgZXh0ZW5kUmVxdWVzdCB0byBlbnN1cmUgdGhhdCB0aGVcbi8vIG5ldyBjb250ZXh0IChUKSB3YXMgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHJlcXVlc3QuIEl0J3Mga2luZCBvZiBhbm5veWluZ1xuLy8gdG8gdXNlIGluIHByYWN0aWNlLCBzbyB3ZSBkb24ndCB1c2UgaXQgZm9yIG91ciBXcmFwcGVycyAoeWV0KVxuZXhwb3J0IHR5cGUgU2FmZXJNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAsIHJlczogUmVzKSA9PiBhbnlcblxuZXhwb3J0IGNvbnN0IGV4dGVuZFJlcXVlc3QgPSA8VCBleHRlbmRzIFJlcSwgSyBleHRlbmRzIHt9PihcbiAgcmVxOiBULFxuICBtZXJnZTogS1xuKTogVCAmIEsgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlKSkge1xuICAgIDsocmVxIGFzIGFueSlba2V5XSA9IHZcbiAgfVxuICByZXR1cm4gcmVxIGFzIGFueVxufVxuXG50eXBlIFdyYXBwZXJzMSA9IDxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnMyID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgZW5kcG9pbnQ6IChyZXE6IFJlcSAmIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFRPRE8gZmlndXJlIG91dCBob3cgdG8gZG8gYSByZWN1cnNpdmUgZGVmaW5pdGlvbiwgb3Igb25lIHRoYXQgc2ltcGxpZmllc1xuLy8gdGhlc2UgcmVkdW5kYW50IHdyYXBwZXJzXG5cbnR5cGUgV3JhcHBlcnMzID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNCA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczUgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczYgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXAsXG4gIE13NlJlcXVlc3RDb250ZXh0LFxuICBNdzZEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc2OiBNaWRkbGV3YXJlPFxuICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc2RGVwXG4gICAgICA/IE13NkRlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNyA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcCxcbiAgTXc3UmVxdWVzdENvbnRleHQsXG4gIE13N0RlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NzogTWlkZGxld2FyZTxcbiAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13N0RlcFxuICAgICAgPyBNdzdEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVycyA9IFdyYXBwZXJzMSAmXG4gIFdyYXBwZXJzMiAmXG4gIFdyYXBwZXJzMyAmXG4gIFdyYXBwZXJzNCAmXG4gIFdyYXBwZXJzNSAmXG4gIFdyYXBwZXJzNiAmXG4gIFdyYXBwZXJzN1xuXG5leHBvcnQgY29uc3Qgd3JhcHBlcnM6IFdyYXBwZXJzID0gKC4uLndyYXBwZXJzQXJnczogYW55W10pID0+IHtcbiAgY29uc3Qgd3JhcHBlZEZ1bmN0aW9uID0gd3JhcHBlcnNBcmdzW3dyYXBwZXJzQXJncy5sZW5ndGggLSAxXVxuICBjb25zdCBtd3MgPSB3cmFwcGVyc0FyZ3Muc2xpY2UoMCwgLTEpXG5cbiAgbGV0IGxhc3RXcmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVkRnVuY3Rpb25cbiAgZm9yIChsZXQgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxhc3RXcmFwcGVkRnVuY3Rpb24gPSAobXdzW2ldIGFzIGFueSkobGFzdFdyYXBwZWRGdW5jdGlvbilcbiAgfVxuXG4gIHJldHVybiBsYXN0V3JhcHBlZEZ1bmN0aW9uXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJzXG4iLCAiaW1wb3J0IHsgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5leHBvcnQgdHlwZSBIVFRQTWV0aG9kcyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG5cbmV4cG9ydCBjb25zdCB3aXRoTWV0aG9kcyA9IChtZXRob2RzOiBIVFRQTWV0aG9kc1tdKSA9PiAobmV4dCkgPT4gKHJlcSwgcmVzKSA9PiB7XG4gIGlmICghbWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKHtcbiAgICAgIHR5cGU6IFwibWV0aG9kX25vdF9hbGxvd2VkXCIsXG4gICAgICBtZXNzYWdlOiBgb25seSAke21ldGhvZHMuam9pbihcIixcIil9IGFjY2VwdGVkYCxcbiAgICB9KVxuICB9XG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoTWV0aG9kc1xuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHosIFpvZEZpcnN0UGFydHlUeXBlS2luZCB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgUXVlcnlBcnJheUZvcm1hdHMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgREVGQVVMVF9BUlJBWV9GT1JNQVRTIH0gZnJvbSBcIi4uXCJcblxuY29uc3QgZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYSA9IChcbiAgaXNab2RFZmZlY3Q6IGJvb2xlYW4sXG4gIHNjaGVtYTogei5ab2RUeXBlQW55XG4pOiB6LlpvZFR5cGVBbnkgfCB6LlpvZE9iamVjdDxhbnk+ID0+IHtcbiAgaWYgKCFpc1pvZEVmZmVjdCkge1xuICAgIHJldHVybiBzY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuICB9XG5cbiAgbGV0IGN1cnJlbnRTY2hlbWEgPSBzY2hlbWFcblxuICB3aGlsZSAoY3VycmVudFNjaGVtYSBpbnN0YW5jZW9mIHouWm9kRWZmZWN0cykge1xuICAgIGN1cnJlbnRTY2hlbWEgPSBjdXJyZW50U2NoZW1hLl9kZWYuc2NoZW1hXG4gIH1cblxuICByZXR1cm4gY3VycmVudFNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzY2hlbWEgZnJvbSBhIFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbCBzY2hlbWEuXG4gKiBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgYWxsIHNwZWNpYWwgY2FzZXMgb2YgWm9kU2NoZW1hIGFuZCBub3QganVzdCBab2RFZmZlY3QgfCBab2REZWZhdWx0IHwgWm9kT3B0aW9uYWxcbiAqL1xuY29uc3QgZ2V0Wm9kRGVmRnJvbVpvZFNjaGVtYUhlbHBlcnMgPSAoc2NoZW1hOiB6LlpvZFR5cGVBbnkpID0+IHtcbiAgY29uc3Qgc3BlY2lhbF96b2RfdHlwZXMgPSBbXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICBdXG5cbiAgd2hpbGUgKHNwZWNpYWxfem9kX3R5cGVzLmluY2x1ZGVzKHNjaGVtYS5fZGVmLnR5cGVOYW1lKSkge1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwgfHxcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdFxuICAgICkge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuaW5uZXJUeXBlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5fZGVmLnNjaGVtYVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5fZGVmXG59XG5cbmNvbnN0IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0ID0gKFxuICBzY2hlbWE6IHouWm9kVHlwZUFueVxuKTogei5ab2RPYmplY3Q8YW55PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGlzWm9kRWZmZWN0ID0gc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gIGNvbnN0IHNhZmVfc2NoZW1hID0gZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYShpc1pvZEVmZmVjdCwgc2NoZW1hKVxuICBjb25zdCBpc1pvZE9iamVjdCA9XG4gICAgc2FmZV9zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdFxuXG4gIGlmICghaXNab2RPYmplY3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gc2FmZV9zY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxufVxuXG5jb25zdCBpc1pvZFNjaGVtYUFycmF5ID0gKHNjaGVtYTogei5ab2RUeXBlQW55KSA9PiB7XG4gIGNvbnN0IGRlZiA9IGdldFpvZERlZkZyb21ab2RTY2hlbWFIZWxwZXJzKHNjaGVtYSlcbiAgcmV0dXJuIGRlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5XG59XG5cbmNvbnN0IGlzWm9kU2NoZW1hQm9vbGVhbiA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCBkZWYgPSBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyhzY2hlbWEpXG4gIHJldHVybiBkZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCb29sZWFuXG59XG5cbmNvbnN0IHBhcnNlUXVlcnlQYXJhbXMgPSAoXG4gIHNjaGVtYTogei5ab2RUeXBlQW55LFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHN1cHBvcnRlZEFycmF5Rm9ybWF0czogUXVlcnlBcnJheUZvcm1hdHNcbikgPT4ge1xuICBjb25zdCBwYXJzZWRfaW5wdXQgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dClcbiAgY29uc3Qgb2JqX3NjaGVtYSA9IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0KHNjaGVtYSlcblxuICBpZiAob2JqX3NjaGVtYSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9ial9zY2hlbWEuc2hhcGUpKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheSh2YWx1ZSBhcyB6LlpvZFR5cGVBbnkpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5X2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJjb21tYVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IGFycmF5X2lucHV0LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPSBpbnB1dFtgJHtrZXl9W11gXVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzLmluY2x1ZGVzKFwiYnJhY2tldHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJlX3NwbGl0X2FycmF5ID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IHByZV9zcGxpdF9hcnJheS5zcGxpdChcIixcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0KSAmJlxuICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcImJyYWNrZXRzXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1pvZFNjaGVtYUJvb2xlYW4odmFsdWUgYXMgei5ab2RUeXBlQW55KSkge1xuICAgICAgICBjb25zdCBib29sZWFuX2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYm9vbGVhbl9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYm9vbGVhbl9pbnB1dCA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY2hlbWEucGFyc2UocGFyc2VkX2lucHV0KVxufVxuXG5jb25zdCB2YWxpZGF0ZVF1ZXJ5UGFyYW1zID0gKFxuICBpbnB1dFVybDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZUFueSxcbiAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzOiBRdWVyeUFycmF5Rm9ybWF0c1xuKSA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoaW5wdXRVcmwsIFwiaHR0cDovL2R1bW15LmNvbVwiKVxuXG4gIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBjb25zdCBvYmpfc2NoZW1hID0gdHJ5R2V0Wm9kU2NoZW1hQXNPYmplY3Qoc2NoZW1hKVxuICBpZiAoIW9ial9zY2hlbWEpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIHVybC5zZWFyY2hQYXJhbXMua2V5cygpKSB7XG4gICAgZm9yIChjb25zdCBbc2NoZW1hS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGlmIChpc1pvZFNjaGVtYUFycmF5KHZhbHVlIGFzIHouWm9kVHlwZUFueSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gYCR7c2NoZW1hS2V5fVtdYCAmJlxuICAgICAgICAgICFzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJicmFja2V0c1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBcImludmFsaWRfcXVlcnlfcGFyYW1zXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQnJhY2tldCBzeW50YXggbm90IHN1cHBvcnRlZCBmb3IgcXVlcnkgcGFyYW0gXCIke3NjaGVtYUtleX1cImAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGtleV9zY2hlbWEgPSBvYmpfc2NoZW1hLnNoYXBlW2tleV1cblxuICAgIGlmIChrZXlfc2NoZW1hKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheShrZXlfc2NoZW1hKSkge1xuICAgICAgICBpZiAoc2VlbktleXMuaGFzKGtleSkgJiYgIXN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcInJlcGVhdFwiKSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9xdWVyeV9wYXJhbXNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXBlYXRlZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQgZm9yIGR1cGxpY2F0ZSBxdWVyeSBwYXJhbSBcIiR7a2V5fVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VlbktleXMuYWRkKGtleSlcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnB1dDxcbiAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbj4ge1xuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxuICBzdXBwb3J0ZWRBcnJheUZvcm1hdHM/OiBRdWVyeUFycmF5Rm9ybWF0c1xufVxuXG5jb25zdCB6b2RJc3N1ZVRvU3RyaW5nID0gKGlzc3VlOiB6LlpvZElzc3VlKSA9PiB7XG4gIGlmIChpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2VcbiAgfVxuICBpZiAoaXNzdWUubWVzc2FnZSA9PT0gXCJSZXF1aXJlZFwiKSB7XG4gICAgcmV0dXJuIGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9IGlzIHJlcXVpcmVkYFxuICB9XG4gIHJldHVybiBgJHtpc3N1ZS5tZXNzYWdlfSBmb3IgXCIke2lzc3VlLnBhdGguam9pbihcIi5cIil9XCJgXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSnNvblJlc3BvbnNlPEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueT4oXG4gIGpzb25SZXNwb25zZTogSnNvblJlc3BvbnNlIHwgdW5kZWZpbmVkLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVxuKSB7XG4gIGNvbnN0IG9yaWdpbmFsX3Jlc19qc29uID0gcmVzLmpzb25cbiAgY29uc3Qgb3ZlcnJpZGVfcmVzX2pzb24gPSAoanNvbjogYW55KSA9PiB7XG4gICAgY29uc3QgaXNfc3VjY2VzcyA9IHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMFxuICAgIGlmICghaXNfc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGpzb25SZXNwb25zZT8ucGFyc2UoanNvbilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX3Jlc3BvbnNlXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHdpdGgganNvblJlc3BvbnNlXCIsXG4gICAgICAgIHpvZEVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICB9XG4gIHJlcy5qc29uID0gb3ZlcnJpZGVfcmVzX2pzb25cbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhWYWxpZGF0aW9uID1cbiAgPFxuICAgIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgPihcbiAgICBpbnB1dDogUmVxdWVzdElucHV0PFxuICAgICAgSnNvbkJvZHksXG4gICAgICBRdWVyeVBhcmFtcyxcbiAgICAgIENvbW1vblBhcmFtcyxcbiAgICAgIEZvcm1EYXRhLFxuICAgICAgSnNvblJlc3BvbnNlXG4gICAgPlxuICApID0+XG4gIChuZXh0KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB7IHN1cHBvcnRlZEFycmF5Rm9ybWF0cyA9IERFRkFVTFRfQVJSQVlfRk9STUFUUyB9ID0gaW5wdXRcblxuICAgIGlmIChcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5qc29uQm9keSkgfHxcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5jb21tb25QYXJhbXMpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGZvcm1EYXRhIHdpdGgganNvbkJvZHkgb3IgY29tbW9uUGFyYW1zXCIpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHJlcS5tZXRob2QgPT09IFwiUE9TVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiUEFUQ0hcIikgJiZcbiAgICAgIChpbnB1dC5qc29uQm9keSB8fCBpbnB1dC5jb21tb25QYXJhbXMpICYmXG4gICAgICAhcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSAmJlxuICAgICAgIV8uaXNFbXB0eShyZXEuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2NvbnRlbnRfdHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgJHtyZXEubWV0aG9kfSByZXF1ZXN0cyBtdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24vanNvblwiYCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaW5wdXQuZm9ybURhdGEgJiZcbiAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXG4gICAgICAgIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIClcbiAgICAgIC8vIFRPRE8gZXZlbnR1YWxseSB3ZSBzaG91bGQgc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYE11c3QgaGF2ZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMgPSB7IC4uLnJlcS5xdWVyeSwgLi4ucmVxLmJvZHkgfVxuXG4gICAgICBjb25zdCB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSA9IGlucHV0LnNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHlcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogcmVxLm1ldGhvZCAhPT0gXCJHRVRcIlxuXG4gICAgICBjb25zdCBpc0Zvcm1EYXRhID0gQm9vbGVhbihpbnB1dC5mb3JtRGF0YSlcblxuICAgICAgaWYgKGlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5mb3JtRGF0YT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmICghaXNGb3JtRGF0YSAmJiB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXEuYm9keSA9IGlucHV0Lmpzb25Cb2R5Py5wYXJzZShyZXEuYm9keSlcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LnF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIGlmICghcmVxLnVybCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlcS51cmwgaXMgdW5kZWZpbmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZVF1ZXJ5UGFyYW1zKHJlcS51cmwsIGlucHV0LnF1ZXJ5UGFyYW1zLCBzdXBwb3J0ZWRBcnJheUZvcm1hdHMpXG5cbiAgICAgICAgcmVxLnF1ZXJ5ID0gcGFyc2VRdWVyeVBhcmFtcyhcbiAgICAgICAgICBpbnB1dC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICByZXEucXVlcnksXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LmNvbW1vblBhcmFtcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXMgY29tbW9uUGFyYW1zIGluY2x1ZGVzIHF1ZXJ5IHBhcmFtcywgd2UgY2FuIHVzZSB0aGUgcGFyc2VRdWVyeVBhcmFtcyBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgOyhyZXEgYXMgYW55KS5jb21tb25QYXJhbXMgPSBwYXJzZVF1ZXJ5UGFyYW1zKFxuICAgICAgICAgIGlucHV0LmNvbW1vblBhcmFtcyxcbiAgICAgICAgICBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMsXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYWRSZXF1ZXN0RXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSBcIlpvZEVycm9yXCIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yLmlzc3Vlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBpc3N1ZSA9IGVycm9yLmlzc3Vlc1swXVxuICAgICAgICAgIG1lc3NhZ2UgPSB6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfY29tcG9uZW50czogc3RyaW5nW10gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICBtZXNzYWdlX2NvbXBvbmVudHMucHVzaCh6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBgJHtlcnJvci5pc3N1ZXMubGVuZ3RofSBJbnB1dCBFcnJvcnM6IGAgK1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLmpvaW4oXCIsIFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdmFsaWRhdGlvbl9lcnJvcnM6IGVycm9yLmZvcm1hdCgpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICBtZXNzYWdlOiBcIkVycm9yIHdoaWxlIHBhcnNpbmcgaW5wdXRcIixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSByZXMuanNvbiBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgaWYgKGlucHV0LnNob3VsZFZhbGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICB2YWxpZGF0ZUpzb25SZXNwb25zZShpbnB1dC5qc29uUmVzcG9uc2UsIHJlcylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChyZXEsIHJlcylcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoVmFsaWRhdGlvblxuIiwgImltcG9ydCB7IE5leHRBcGlSZXNwb25zZSwgTmV4dEFwaVJlcXVlc3QgfSBmcm9tIFwibmV4dFwiXG5pbXBvcnQgeyB3aXRoRXhjZXB0aW9uSGFuZGxpbmcgfSBmcm9tIFwiLi4vbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmltcG9ydCB3cmFwcGVycywgeyBNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL3dyYXBwZXJzXCJcbmltcG9ydCB7XG4gIENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbixcbiAgUXVlcnlBcnJheUZvcm1hdHMsXG4gIFJvdXRlU3BlYyxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB3aXRoTWV0aG9kcywgeyBIVFRQTWV0aG9kcyB9IGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtbWV0aG9kc1wiXG5pbXBvcnQgd2l0aFZhbGlkYXRpb24gZnJvbSBcIi4vbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcblxudHlwZSBQYXJhbURlZiA9IHouWm9kVHlwZUFueSB8IHouWm9kRWZmZWN0czx6LlpvZFR5cGVBbnk+XG5cbmV4cG9ydCBjb25zdCBjaGVja1JvdXRlU3BlYyA9IDxcbiAgQXV0aFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIE1ldGhvZHMgZXh0ZW5kcyBIVFRQTWV0aG9kc1tdID0gSFRUUE1ldGhvZHNbXSxcbiAgSnNvbkJvZHkgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgUXVlcnlQYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgQ29tbW9uUGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIE1pZGRsZXdhcmVzIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXSA9IHJlYWRvbmx5IE1pZGRsZXdhcmU8XG4gICAgYW55LFxuICAgIGFueVxuICA+W10sXG4gIEZvcm1EYXRhIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFNwZWMgZXh0ZW5kcyBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPiA9IFJvdXRlU3BlYzxcbiAgICBBdXRoVHlwZSxcbiAgICBNZXRob2RzLFxuICAgIEpzb25Cb2R5LFxuICAgIFF1ZXJ5UGFyYW1zLFxuICAgIENvbW1vblBhcmFtcyxcbiAgICBNaWRkbGV3YXJlcyxcbiAgICBGb3JtRGF0YVxuICA+XG4+KFxuICBzcGVjOiBTcGVjXG4pOiBzdHJpbmcgZXh0ZW5kcyBTcGVjW1wiYXV0aFwiXVxuICA/IGB5b3VyIHJvdXRlIHNwZWMgaXMgdW5kZXJzcGVjaWZpZWQsIGFkZCBcImFzIGNvbnN0XCJgXG4gIDogU3BlYyA9PiBzcGVjIGFzIGFueVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUlJBWV9GT1JNQVRTOiBRdWVyeUFycmF5Rm9ybWF0cyA9IFtcbiAgXCJicmFja2V0c1wiLFxuICBcImNvbW1hXCIsXG4gIFwicmVwZWF0XCIsXG5dXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXaXRoUm91dGVTcGVjOiBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24gPSAoKFxuICBzZXR1cFBhcmFtc1xuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhdXRoTWlkZGxld2FyZU1hcCA9IHt9LFxuICAgIGdsb2JhbE1pZGRsZXdhcmVzID0gW10sXG4gICAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMsXG4gICAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keSA9IHRydWUsXG4gICAgZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlID0gd2l0aEV4Y2VwdGlvbkhhbmRsaW5nKHtcbiAgICAgIGFkZE9rU3RhdHVzOiBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyxcbiAgICAgIGV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9uczoge1xuICAgICAgICBnZXRFcnJvckNvbnRleHQ6IChyZXEsIGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVycm9yXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pIGFzIGFueSxcbiAgICBnbG9iYWxTY2hlbWFzID0gc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXNcbiAgICAgID8ge1xuICAgICAgICAgIG9rOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgfVxuICAgICAgOiB7fSxcbiAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMgPSBERUZBVUxUX0FSUkFZX0ZPUk1BVFMsXG4gIH0gPSBzZXR1cFBhcmFtc1xuXG4gIGNvbnN0IHdpdGhSb3V0ZVNwZWMgPSAoc3BlYzogUm91dGVTcGVjKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlUm91dGVFeHBvcnQgPSAodXNlckRlZmluZWRSb3V0ZUZuKSA9PiB7XG4gICAgICBjb25zdCByb290UmVxdWVzdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIHJlcTogTmV4dEFwaVJlcXVlc3QsXG4gICAgICAgIHJlczogTmV4dEFwaVJlc3BvbnNlXG4gICAgICApID0+IHtcbiAgICAgICAgYXV0aE1pZGRsZXdhcmVNYXBbXCJub25lXCJdID0gKG5leHQpID0+IG5leHRcblxuICAgICAgICBjb25zdCBhdXRoX21pZGRsZXdhcmUgPSBhdXRoTWlkZGxld2FyZU1hcFtzcGVjLmF1dGhdXG4gICAgICAgIGlmICghYXV0aF9taWRkbGV3YXJlKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXV0aCB0eXBlOiAke3NwZWMuYXV0aH1gKVxuXG4gICAgICAgIHJldHVybiB3cmFwcGVycyhcbiAgICAgICAgICAuLi4oKGV4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZVxuICAgICAgICAgICAgPyBbZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlXVxuICAgICAgICAgICAgOiBbXSkgYXMgW2FueV0pLFxuICAgICAgICAgIC4uLigoZ2xvYmFsTWlkZGxld2FyZXMgfHwgW10pIGFzIFtdKSxcbiAgICAgICAgICBhdXRoX21pZGRsZXdhcmUsXG4gICAgICAgICAgLi4uKChzcGVjLm1pZGRsZXdhcmVzIHx8IFtdKSBhcyBbXSksXG4gICAgICAgICAgd2l0aE1ldGhvZHMoc3BlYy5tZXRob2RzKSxcbiAgICAgICAgICB3aXRoVmFsaWRhdGlvbih7XG4gICAgICAgICAgICBqc29uQm9keTogc3BlYy5qc29uQm9keSxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBzcGVjLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgY29tbW9uUGFyYW1zOiBzcGVjLmNvbW1vblBhcmFtcyxcbiAgICAgICAgICAgIGZvcm1EYXRhOiBzcGVjLmZvcm1EYXRhLFxuICAgICAgICAgICAganNvblJlc3BvbnNlOiBzcGVjLmpzb25SZXNwb25zZSxcbiAgICAgICAgICAgIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzLFxuICAgICAgICAgICAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB1c2VyRGVmaW5lZFJvdXRlRm5cbiAgICAgICAgKShyZXEgYXMgYW55LCByZXMpXG4gICAgICB9XG5cbiAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5fc2V0dXBQYXJhbXMgPSBzZXR1cFBhcmFtc1xuICAgICAgcm9vdFJlcXVlc3RIYW5kbGVyLl9yb3V0ZVNwZWMgPSBzcGVjXG5cbiAgICAgIHJldHVybiByb290UmVxdWVzdEhhbmRsZXJcbiAgICB9XG5cbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fc2V0dXBQYXJhbXMgPSBzZXR1cFBhcmFtc1xuICAgIGNyZWF0ZVJvdXRlRXhwb3J0Ll9yb3V0ZVNwZWMgPSBzcGVjXG5cbiAgICByZXR1cm4gY3JlYXRlUm91dGVFeHBvcnRcbiAgfVxuXG4gIHdpdGhSb3V0ZVNwZWMuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcblxuICByZXR1cm4gd2l0aFJvdXRlU3BlY1xufSkgYXMgYW55XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFB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QUk7QUFFSixRQUFNLGdCQUFnQixDQUFDLFNBQW9CO0FBQ3pDLFVBQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQ2hELFlBQU0scUJBQXFCLE9BQ3pCLEtBQ0EsUUFDRztBQUNILDBCQUFrQixVQUFVLENBQUMsU0FBUztBQUV0QyxjQUFNLGtCQUFrQixrQkFBa0IsS0FBSztBQUMvQyxZQUFJLENBQUM7QUFBaUIsZ0JBQU0sSUFBSSxNQUFNLHNCQUFzQixLQUFLLE1BQU07QUFFdkUsZUFBTztBQUFBLFVBQ0wsR0FBSyw4QkFDRCxDQUFDLDJCQUEyQixJQUM1QixDQUFDO0FBQUEsVUFDTCxHQUFLLHFCQUFxQixDQUFDO0FBQUEsVUFDM0I7QUFBQSxVQUNBLEdBQUssS0FBSyxlQUFlLENBQUM7QUFBQSxVQUMxQixxQkFBWSxLQUFLLE9BQU87QUFBQSxVQUN4Qix3QkFBZTtBQUFBLFlBQ2IsVUFBVSxLQUFLO0FBQUEsWUFDZixhQUFhLEtBQUs7QUFBQSxZQUNsQixjQUFjLEtBQUs7QUFBQSxZQUNuQixVQUFVLEtBQUs7QUFBQSxZQUNmLGNBQWMsS0FBSztBQUFBLFlBQ25CO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFBQSxVQUNEO0FBQUEsUUFDRixFQUFFLEtBQVksR0FBRztBQUFBLE1BQ25CO0FBRUEseUJBQW1CLGVBQWU7QUFDbEMseUJBQW1CLGFBQWE7QUFFaEMsYUFBTztBQUFBLElBQ1Q7QUFFQSxzQkFBa0IsZUFBZTtBQUNqQyxzQkFBa0IsYUFBYTtBQUUvQixXQUFPO0FBQUEsRUFDVDtBQUVBLGdCQUFjLGVBQWU7QUFFN0IsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJ3aXRoRXhjZXB0aW9uSGFuZGxpbmciLCAid2l0aEV4Y2VwdGlvbkhhbmRsaW5nIiwgIl8iLCAiaW1wb3J0X3pvZCIsICJ3aXRoRXhjZXB0aW9uSGFuZGxpbmciXQp9Cg==
|
package/dist/index.mjs
CHANGED
|
@@ -75,33 +75,44 @@ var getZodDefFromZodSchemaHelpers = (schema) => {
|
|
|
75
75
|
}
|
|
76
76
|
return schema._def;
|
|
77
77
|
};
|
|
78
|
-
var
|
|
79
|
-
const parsed_input = Object.assign({}, input);
|
|
78
|
+
var tryGetZodSchemaAsObject = (schema) => {
|
|
80
79
|
const isZodEffect = schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects;
|
|
81
80
|
const safe_schema = getZodObjectSchemaFromZodEffectSchema(isZodEffect, schema);
|
|
82
81
|
const isZodObject = safe_schema._def.typeName === ZodFirstPartyTypeKind.ZodObject;
|
|
83
|
-
if (isZodObject) {
|
|
84
|
-
|
|
82
|
+
if (!isZodObject) {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
return safe_schema;
|
|
86
|
+
};
|
|
87
|
+
var isZodSchemaArray = (schema) => {
|
|
88
|
+
const def = getZodDefFromZodSchemaHelpers(schema);
|
|
89
|
+
return def.typeName === ZodFirstPartyTypeKind.ZodArray;
|
|
90
|
+
};
|
|
91
|
+
var isZodSchemaBoolean = (schema) => {
|
|
92
|
+
const def = getZodDefFromZodSchemaHelpers(schema);
|
|
93
|
+
return def.typeName === ZodFirstPartyTypeKind.ZodBoolean;
|
|
94
|
+
};
|
|
95
|
+
var parseQueryParams = (schema, input, supportedArrayFormats) => {
|
|
96
|
+
const parsed_input = Object.assign({}, input);
|
|
97
|
+
const obj_schema = tryGetZodSchemaAsObject(schema);
|
|
98
|
+
if (obj_schema) {
|
|
85
99
|
for (const [key, value] of Object.entries(obj_schema.shape)) {
|
|
86
|
-
|
|
87
|
-
const isArray = def.typeName === ZodFirstPartyTypeKind.ZodArray;
|
|
88
|
-
if (isArray) {
|
|
100
|
+
if (isZodSchemaArray(value)) {
|
|
89
101
|
const array_input = input[key];
|
|
90
|
-
if (typeof array_input === "string") {
|
|
102
|
+
if (typeof array_input === "string" && supportedArrayFormats.includes("comma")) {
|
|
91
103
|
parsed_input[key] = array_input.split(",");
|
|
92
104
|
}
|
|
93
105
|
const bracket_syntax_array_input = input[`${key}[]`];
|
|
94
|
-
if (typeof bracket_syntax_array_input === "string") {
|
|
106
|
+
if (typeof bracket_syntax_array_input === "string" && supportedArrayFormats.includes("brackets")) {
|
|
95
107
|
const pre_split_array = bracket_syntax_array_input;
|
|
96
108
|
parsed_input[key] = pre_split_array.split(",");
|
|
97
109
|
}
|
|
98
|
-
if (Array.isArray(bracket_syntax_array_input)) {
|
|
110
|
+
if (Array.isArray(bracket_syntax_array_input) && supportedArrayFormats.includes("brackets")) {
|
|
99
111
|
parsed_input[key] = bracket_syntax_array_input;
|
|
100
112
|
}
|
|
101
113
|
continue;
|
|
102
114
|
}
|
|
103
|
-
|
|
104
|
-
if (isBoolean) {
|
|
115
|
+
if (isZodSchemaBoolean(value)) {
|
|
105
116
|
const boolean_input = input[key];
|
|
106
117
|
if (typeof boolean_input === "string") {
|
|
107
118
|
parsed_input[key] = boolean_input === "true";
|
|
@@ -111,6 +122,38 @@ var parseQueryParams = (schema, input) => {
|
|
|
111
122
|
}
|
|
112
123
|
return schema.parse(parsed_input);
|
|
113
124
|
};
|
|
125
|
+
var validateQueryParams = (inputUrl, schema, supportedArrayFormats) => {
|
|
126
|
+
const url = new URL(inputUrl, "http://dummy.com");
|
|
127
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
128
|
+
const obj_schema = tryGetZodSchemaAsObject(schema);
|
|
129
|
+
if (!obj_schema) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
for (const key of url.searchParams.keys()) {
|
|
133
|
+
for (const [schemaKey, value] of Object.entries(obj_schema.shape)) {
|
|
134
|
+
if (isZodSchemaArray(value)) {
|
|
135
|
+
if (key === `${schemaKey}[]` && !supportedArrayFormats.includes("brackets")) {
|
|
136
|
+
throw new BadRequestException({
|
|
137
|
+
type: "invalid_query_params",
|
|
138
|
+
message: `Bracket syntax not supported for query param "${schemaKey}"`
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const key_schema = obj_schema.shape[key];
|
|
144
|
+
if (key_schema) {
|
|
145
|
+
if (isZodSchemaArray(key_schema)) {
|
|
146
|
+
if (seenKeys.has(key) && !supportedArrayFormats.includes("repeat")) {
|
|
147
|
+
throw new BadRequestException({
|
|
148
|
+
type: "invalid_query_params",
|
|
149
|
+
message: `Repeated parameters not supported for duplicate query param "${key}"`
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
seenKeys.add(key);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
114
157
|
var zodIssueToString = (issue) => {
|
|
115
158
|
if (issue.path.join(".") === "") {
|
|
116
159
|
return issue.message;
|
|
@@ -142,6 +185,7 @@ function validateJsonResponse(jsonResponse, res) {
|
|
|
142
185
|
}
|
|
143
186
|
var withValidation = (input) => (next) => async (req, res) => {
|
|
144
187
|
var _a, _b, _c, _d;
|
|
188
|
+
const { supportedArrayFormats = DEFAULT_ARRAY_FORMATS } = input;
|
|
145
189
|
if (input.formData && input.jsonBody || input.formData && input.commonParams) {
|
|
146
190
|
throw new Error("Cannot use formData with jsonBody or commonParams");
|
|
147
191
|
}
|
|
@@ -170,16 +214,28 @@ var withValidation = (input) => (next) => async (req, res) => {
|
|
|
170
214
|
req.body = (_d = input.jsonBody) == null ? void 0 : _d.parse(req.body);
|
|
171
215
|
}
|
|
172
216
|
if (input.queryParams) {
|
|
173
|
-
|
|
217
|
+
if (!req.url) {
|
|
218
|
+
throw new Error("req.url is undefined");
|
|
219
|
+
}
|
|
220
|
+
validateQueryParams(req.url, input.queryParams, supportedArrayFormats);
|
|
221
|
+
req.query = parseQueryParams(
|
|
222
|
+
input.queryParams,
|
|
223
|
+
req.query,
|
|
224
|
+
supportedArrayFormats
|
|
225
|
+
);
|
|
174
226
|
}
|
|
175
227
|
if (input.commonParams) {
|
|
176
228
|
;
|
|
177
229
|
req.commonParams = parseQueryParams(
|
|
178
230
|
input.commonParams,
|
|
179
|
-
original_combined_params
|
|
231
|
+
original_combined_params,
|
|
232
|
+
supportedArrayFormats
|
|
180
233
|
);
|
|
181
234
|
}
|
|
182
235
|
} catch (error) {
|
|
236
|
+
if (error instanceof BadRequestException) {
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
183
239
|
if (error.name === "ZodError") {
|
|
184
240
|
let message;
|
|
185
241
|
if (error.issues.length === 1) {
|
|
@@ -213,6 +269,11 @@ var with_validation_default = withValidation;
|
|
|
213
269
|
// src/with-route-spec/index.ts
|
|
214
270
|
import { z as z2 } from "zod";
|
|
215
271
|
var checkRouteSpec = (spec) => spec;
|
|
272
|
+
var DEFAULT_ARRAY_FORMATS = [
|
|
273
|
+
"brackets",
|
|
274
|
+
"comma",
|
|
275
|
+
"repeat"
|
|
276
|
+
];
|
|
216
277
|
var createWithRouteSpec = (setupParams) => {
|
|
217
278
|
const {
|
|
218
279
|
authMiddlewareMap = {},
|
|
@@ -232,7 +293,8 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
232
293
|
}),
|
|
233
294
|
globalSchemas = setupParams.addOkStatus ? {
|
|
234
295
|
ok: z2.boolean()
|
|
235
|
-
} : {}
|
|
296
|
+
} : {},
|
|
297
|
+
supportedArrayFormats = DEFAULT_ARRAY_FORMATS
|
|
236
298
|
} = setupParams;
|
|
237
299
|
const withRouteSpec = (spec) => {
|
|
238
300
|
const createRouteExport = (userDefinedRouteFn) => {
|
|
@@ -254,7 +316,8 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
254
316
|
formData: spec.formData,
|
|
255
317
|
jsonResponse: spec.jsonResponse,
|
|
256
318
|
shouldValidateResponses,
|
|
257
|
-
shouldValidateGetRequestBody
|
|
319
|
+
shouldValidateGetRequestBody,
|
|
320
|
+
supportedArrayFormats
|
|
258
321
|
}),
|
|
259
322
|
userDefinedRouteFn
|
|
260
323
|
)(req, res);
|
|
@@ -275,6 +338,7 @@ var createWithRouteSpec = (setupParams) => {
|
|
|
275
338
|
init_esm_shims();
|
|
276
339
|
export {
|
|
277
340
|
BadRequestException,
|
|
341
|
+
DEFAULT_ARRAY_FORMATS,
|
|
278
342
|
HttpException,
|
|
279
343
|
InternalServerErrorException,
|
|
280
344
|
MethodNotAllowedException,
|
|
@@ -285,4 +349,4 @@ export {
|
|
|
285
349
|
withExceptionHandling,
|
|
286
350
|
wrappers
|
|
287
351
|
};
|
|
288
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvaW5kZXgudHMiLCAiLi4vc3JjL3dyYXBwZXJzL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzLnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uLnRzIiwgIi4uL3NyYy90eXBlcy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpdGgtcm91dGUtc3BlY1wiXG5leHBvcnQgeyB3cmFwcGVycyB9IGZyb20gXCIuL3dyYXBwZXJzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCJcbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVzcG9uc2UsIE5leHRBcGlSZXF1ZXN0IH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgd2l0aEV4Y2VwdGlvbkhhbmRsaW5nIH0gZnJvbSBcIi4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5pbXBvcnQgd3JhcHBlcnMsIHsgTWlkZGxld2FyZSB9IGZyb20gXCIuLi93cmFwcGVyc1wiXG5pbXBvcnQgeyBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24sIFJvdXRlU3BlYyB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgd2l0aE1ldGhvZHMsIHsgSFRUUE1ldGhvZHMgfSBmcm9tIFwiLi9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHNcIlxuaW1wb3J0IHdpdGhWYWxpZGF0aW9uIGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtdmFsaWRhdGlvblwiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5cbnR5cGUgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnkgfCB6LlpvZEVmZmVjdHM8ei5ab2RUeXBlQW55PlxuXG5leHBvcnQgY29uc3QgY2hlY2tSb3V0ZVNwZWMgPSA8XG4gIEF1dGhUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBNZXRob2RzIGV4dGVuZHMgSFRUUE1ldGhvZHNbXSA9IEhUVFBNZXRob2RzW10sXG4gIEpzb25Cb2R5IGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIENvbW1vblBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBNaWRkbGV3YXJlcyBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmU8YW55LCBhbnk+W10gPSByZWFkb25seSBNaWRkbGV3YXJlPFxuICAgIGFueSxcbiAgICBhbnlcbiAgPltdLFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBTcGVjIGV4dGVuZHMgUm91dGVTcGVjPFxuICAgIEF1dGhUeXBlLFxuICAgIE1ldGhvZHMsXG4gICAgSnNvbkJvZHksXG4gICAgUXVlcnlQYXJhbXMsXG4gICAgQ29tbW9uUGFyYW1zLFxuICAgIE1pZGRsZXdhcmVzLFxuICAgIEZvcm1EYXRhXG4gID4gPSBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPlxuPihcbiAgc3BlYzogU3BlY1xuKTogc3RyaW5nIGV4dGVuZHMgU3BlY1tcImF1dGhcIl1cbiAgPyBgeW91ciByb3V0ZSBzcGVjIGlzIHVuZGVyc3BlY2lmaWVkLCBhZGQgXCJhcyBjb25zdFwiYFxuICA6IFNwZWMgPT4gc3BlYyBhcyBhbnlcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdpdGhSb3V0ZVNwZWM6IENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbiA9ICgoXG4gIHNldHVwUGFyYW1zXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGF1dGhNaWRkbGV3YXJlTWFwID0ge30sXG4gICAgZ2xvYmFsTWlkZGxld2FyZXMgPSBbXSxcbiAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5ID0gdHJ1ZSxcbiAgICBleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmUgPSB3aXRoRXhjZXB0aW9uSGFuZGxpbmcoe1xuICAgICAgYWRkT2tTdGF0dXM6IHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzLFxuICAgICAgZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zOiB7XG4gICAgICAgIGdldEVycm9yQ29udGV4dDogKHJlcSwgZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXJyb3JcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55LFxuICAgIGdsb2JhbFNjaGVtYXMgPSBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1c1xuICAgICAgPyB7XG4gICAgICAgICAgb2s6IHouYm9vbGVhbigpLFxuICAgICAgICB9XG4gICAgICA6IHt9LFxuICB9ID0gc2V0dXBQYXJhbXNcblxuICBjb25zdCB3aXRoUm91dGVTcGVjID0gKHNwZWM6IFJvdXRlU3BlYykgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZVJvdXRlRXhwb3J0ID0gKHVzZXJEZWZpbmVkUm91dGVGbikgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlcXVlc3RIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgICAgICByZXM6IE5leHRBcGlSZXNwb25zZVxuICAgICAgKSA9PiB7XG4gICAgICAgIGF1dGhNaWRkbGV3YXJlTWFwW1wibm9uZVwiXSA9IChuZXh0KSA9PiBuZXh0XG5cbiAgICAgICAgY29uc3QgYXV0aF9taWRkbGV3YXJlID0gYXV0aE1pZGRsZXdhcmVNYXBbc3BlYy5hdXRoXVxuICAgICAgICBpZiAoIWF1dGhfbWlkZGxld2FyZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF1dGggdHlwZTogJHtzcGVjLmF1dGh9YClcblxuICAgICAgICByZXR1cm4gd3JhcHBlcnMoXG4gICAgICAgICAgLi4uKChleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmVcbiAgICAgICAgICAgID8gW2V4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZV1cbiAgICAgICAgICAgIDogW10pIGFzIFthbnldKSxcbiAgICAgICAgICAuLi4oKGdsb2JhbE1pZGRsZXdhcmVzIHx8IFtdKSBhcyBbXSksXG4gICAgICAgICAgYXV0aF9taWRkbGV3YXJlLFxuICAgICAgICAgIC4uLigoc3BlYy5taWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIHdpdGhNZXRob2RzKHNwZWMubWV0aG9kcyksXG4gICAgICAgICAgd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICAgICAganNvbkJvZHk6IHNwZWMuanNvbkJvZHksXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogc3BlYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGNvbW1vblBhcmFtczogc3BlYy5jb21tb25QYXJhbXMsXG4gICAgICAgICAgICBmb3JtRGF0YTogc3BlYy5mb3JtRGF0YSxcbiAgICAgICAgICAgIGpzb25SZXNwb25zZTogc3BlYy5qc29uUmVzcG9uc2UsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICAgICAgICAgIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdXNlckRlZmluZWRSb3V0ZUZuXG4gICAgICAgICkocmVxIGFzIGFueSwgcmVzKVxuICAgICAgfVxuXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgICByZXR1cm4gcm9vdFJlcXVlc3RIYW5kbGVyXG4gICAgfVxuXG4gICAgY3JlYXRlUm91dGVFeHBvcnQuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlRXhwb3J0XG4gIH1cblxuICB3aXRoUm91dGVTcGVjLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG5cbiAgcmV0dXJuIHdpdGhSb3V0ZVNwZWNcbn0pIGFzIGFueVxuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QgYXMgUmVxLCBOZXh0QXBpUmVzcG9uc2UgYXMgUmVzIH0gZnJvbSBcIm5leHRcIlxuLypcblxuV3JhcHMgYSBmdW5jdGlvbiBpbiBsYXllcnMgb2Ygb3RoZXIgZnVuY3Rpb25zLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBpbnB1dC9vdXRwdXRcbnR5cGUuIFRoZSBvdXRwdXQgb2Ygd3JhcHBlcnMgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdHlwZSBvZiBpdCdzIGxhc3QgcGFyYW1ldGVyXG4odGhlIHdyYXBwZWQgZnVuY3Rpb24pXG5cblRoaXMgZnVuY3Rpb24gdHVybnMgdGhpcyB0eXBlIG9mIGNvbXBvc2l0aW9uLi4uXG5cbmxvZ2dlci53aXRoQ29udGV4dChcInNvbWVjb250ZXh0XCIpKFxuICBhc3luYyAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhXG4gIH1cbilcblxuSW50by4uLlxuXG53cmFwcGVycyhcbiAgbG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIiksXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5IYXZpbmcgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kIGhlbHBzIHByZXNlcnZlIHR5cGVzLCB3aGljaCBvdGhlcndpc2UgY2FuIGdldFxubWVzc2VkIHVwIGJ5IHRoZSBtaWRkbGV3YXJlcy4gSXQgYWxzbyBjYW4gbWFrZSB0aGUgY29kZSBjbGVhbmVyIHdoZXJlIHRoZXJlIGFyZVxubXVsdGlwbGUgd3JhcHBlcnMuXG5cbiMjIEVYQU1QTEVTXG5cbkluIHRoZSBjb250ZXh0IG9mIHJlcXVlc3QgbWlkZGxld2FyZSB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcy4uLlxuXG5jb25zdCB3aXRoUmVxdWVzdExvZ2dpbmdNaWRkbGV3YXJlID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICBjb25zb2xlLmxvZyhgR09UIFJFUVVFU1QgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofWApXG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIHdyYXBwZXIgdGhhdCB0YWtlcyBzb21lIHBhcmFtZXRlcnMuLi5cblxuY29uc3Qgd2l0aExvZ2dlZEFyZ3VtZW50cyA9XG4gICAgKGxvZ1ByZWZpeDogc3RyaW5nKSA9PlxuICAgIChuZXh0KSA9PlxuICAgIGFzeW5jICguLi5mdW5jQXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2cobG9nUHJlZml4LCAuLi5mdW5jQXJncylcbiAgICAgIHJldHVybiBuZXh0KC4uLmZ1bmNBcmdzKVxuICAgIH1cblxuKi9cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZTxULCBEZXAgPSB7fT4gPSAoXG4gIG5leHQ6IChyZXE6IFJlcSAmIERlcCAmIFQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuXG4vLyBTYWZlciBNaWRkbGV3YXJlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgZXh0ZW5kUmVxdWVzdCB0byBlbnN1cmUgdGhhdCB0aGVcbi8vIG5ldyBjb250ZXh0IChUKSB3YXMgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHJlcXVlc3QuIEl0J3Mga2luZCBvZiBhbm5veWluZ1xuLy8gdG8gdXNlIGluIHByYWN0aWNlLCBzbyB3ZSBkb24ndCB1c2UgaXQgZm9yIG91ciBXcmFwcGVycyAoeWV0KVxuZXhwb3J0IHR5cGUgU2FmZXJNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAsIHJlczogUmVzKSA9PiBhbnlcblxuZXhwb3J0IGNvbnN0IGV4dGVuZFJlcXVlc3QgPSA8VCBleHRlbmRzIFJlcSwgSyBleHRlbmRzIHt9PihcbiAgcmVxOiBULFxuICBtZXJnZTogS1xuKTogVCAmIEsgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlKSkge1xuICAgIDsocmVxIGFzIGFueSlba2V5XSA9IHZcbiAgfVxuICByZXR1cm4gcmVxIGFzIGFueVxufVxuXG50eXBlIFdyYXBwZXJzMSA9IDxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnMyID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgZW5kcG9pbnQ6IChyZXE6IFJlcSAmIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFRPRE8gZmlndXJlIG91dCBob3cgdG8gZG8gYSByZWN1cnNpdmUgZGVmaW5pdGlvbiwgb3Igb25lIHRoYXQgc2ltcGxpZmllc1xuLy8gdGhlc2UgcmVkdW5kYW50IHdyYXBwZXJzXG5cbnR5cGUgV3JhcHBlcnMzID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNCA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczUgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczYgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXAsXG4gIE13NlJlcXVlc3RDb250ZXh0LFxuICBNdzZEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc2OiBNaWRkbGV3YXJlPFxuICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc2RGVwXG4gICAgICA/IE13NkRlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNyA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcCxcbiAgTXc3UmVxdWVzdENvbnRleHQsXG4gIE13N0RlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NzogTWlkZGxld2FyZTxcbiAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13N0RlcFxuICAgICAgPyBNdzdEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVycyA9IFdyYXBwZXJzMSAmXG4gIFdyYXBwZXJzMiAmXG4gIFdyYXBwZXJzMyAmXG4gIFdyYXBwZXJzNCAmXG4gIFdyYXBwZXJzNSAmXG4gIFdyYXBwZXJzNiAmXG4gIFdyYXBwZXJzN1xuXG5leHBvcnQgY29uc3Qgd3JhcHBlcnM6IFdyYXBwZXJzID0gKC4uLndyYXBwZXJzQXJnczogYW55W10pID0+IHtcbiAgY29uc3Qgd3JhcHBlZEZ1bmN0aW9uID0gd3JhcHBlcnNBcmdzW3dyYXBwZXJzQXJncy5sZW5ndGggLSAxXVxuICBjb25zdCBtd3MgPSB3cmFwcGVyc0FyZ3Muc2xpY2UoMCwgLTEpXG5cbiAgbGV0IGxhc3RXcmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVkRnVuY3Rpb25cbiAgZm9yIChsZXQgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxhc3RXcmFwcGVkRnVuY3Rpb24gPSAobXdzW2ldIGFzIGFueSkobGFzdFdyYXBwZWRGdW5jdGlvbilcbiAgfVxuXG4gIHJldHVybiBsYXN0V3JhcHBlZEZ1bmN0aW9uXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJzXG4iLCAiaW1wb3J0IHsgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5leHBvcnQgdHlwZSBIVFRQTWV0aG9kcyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG5cbmV4cG9ydCBjb25zdCB3aXRoTWV0aG9kcyA9IChtZXRob2RzOiBIVFRQTWV0aG9kc1tdKSA9PiAobmV4dCkgPT4gKHJlcSwgcmVzKSA9PiB7XG4gIGlmICghbWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKHtcbiAgICAgIHR5cGU6IFwibWV0aG9kX25vdF9hbGxvd2VkXCIsXG4gICAgICBtZXNzYWdlOiBgb25seSAke21ldGhvZHMuam9pbihcIixcIil9IGFjY2VwdGVkYCxcbiAgICB9KVxuICB9XG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoTWV0aG9kc1xuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHosIFpvZEZpcnN0UGFydHlUeXBlS2luZCB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5jb25zdCBnZXRab2RPYmplY3RTY2hlbWFGcm9tWm9kRWZmZWN0U2NoZW1hID0gKFxuICBpc1pvZEVmZmVjdDogYm9vbGVhbixcbiAgc2NoZW1hOiB6LlpvZFR5cGVBbnlcbik6IHouWm9kVHlwZUFueSB8IHouWm9kT2JqZWN0PGFueT4gPT4ge1xuICBpZiAoIWlzWm9kRWZmZWN0KSB7XG4gICAgcmV0dXJuIHNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG4gIH1cblxuICBsZXQgY3VycmVudFNjaGVtYSA9IHNjaGVtYVxuXG4gIHdoaWxlIChjdXJyZW50U2NoZW1hIGluc3RhbmNlb2Ygei5ab2RFZmZlY3RzKSB7XG4gICAgY3VycmVudFNjaGVtYSA9IGN1cnJlbnRTY2hlbWEuX2RlZi5zY2hlbWFcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50U2NoZW1hIGFzIHouWm9kT2JqZWN0PGFueT5cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb3JyZWN0IHNjaGVtYSBmcm9tIGEgWm9kRWZmZWN0IHwgWm9kRGVmYXVsdCB8IFpvZE9wdGlvbmFsIHNjaGVtYS5cbiAqIFRPRE86IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhbmRsZSBhbGwgc3BlY2lhbCBjYXNlcyBvZiBab2RTY2hlbWEgYW5kIG5vdCBqdXN0IFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbFxuICovXG5jb25zdCBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCBzcGVjaWFsX3pvZF90eXBlcyA9IFtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gIF1cblxuICB3aGlsZSAoc3BlY2lhbF96b2RfdHlwZXMuaW5jbHVkZXMoc2NoZW1hLl9kZWYudHlwZU5hbWUpKSB7XG4gICAgaWYgKFxuICAgICAgc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCB8fFxuICAgICAgc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0XG4gICAgKSB7XG4gICAgICBzY2hlbWEgPSBzY2hlbWEuX2RlZi5pbm5lclR5cGVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cykge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuc2NoZW1hXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2NoZW1hLl9kZWZcbn1cblxuY29uc3QgcGFyc2VRdWVyeVBhcmFtcyA9IChcbiAgc2NoZW1hOiB6LlpvZFR5cGVBbnksXG4gIGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKSA9PiB7XG4gIGNvbnN0IHBhcnNlZF9pbnB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KVxuICBjb25zdCBpc1pvZEVmZmVjdCA9IHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICBjb25zdCBzYWZlX3NjaGVtYSA9IGdldFpvZE9iamVjdFNjaGVtYUZyb21ab2RFZmZlY3RTY2hlbWEoaXNab2RFZmZlY3QsIHNjaGVtYSlcbiAgY29uc3QgaXNab2RPYmplY3QgPVxuICAgIHNhZmVfc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3RcblxuICBpZiAoaXNab2RPYmplY3QpIHtcbiAgICBjb25zdCBvYmpfc2NoZW1hID0gc2FmZV9zY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGNvbnN0IGRlZiA9IGdldFpvZERlZkZyb21ab2RTY2hlbWFIZWxwZXJzKHZhbHVlIGFzIHouWm9kVHlwZUFueSlcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBkZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheVxuICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgY29uc3QgYXJyYXlfaW5wdXQgPSBpbnB1dFtrZXldXG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheV9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYXJyYXlfaW5wdXQuc3BsaXQoXCIsXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dCA9IGlucHV0W2Ake2tleX1bXWBdXG4gICAgICAgIGlmICh0eXBlb2YgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBwcmVfc3BsaXRfYXJyYXkgPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gcHJlX3NwbGl0X2FycmF5LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQpKSB7XG4gICAgICAgICAgcGFyc2VkX2lucHV0W2tleV0gPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNCb29sZWFuID0gZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhblxuICAgICAgaWYgKGlzQm9vbGVhbikge1xuICAgICAgICBjb25zdCBib29sZWFuX2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYm9vbGVhbl9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYm9vbGVhbl9pbnB1dCA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY2hlbWEucGFyc2UocGFyc2VkX2lucHV0KVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnB1dDxcbiAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbj4ge1xuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxufVxuXG5jb25zdCB6b2RJc3N1ZVRvU3RyaW5nID0gKGlzc3VlOiB6LlpvZElzc3VlKSA9PiB7XG4gIGlmIChpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2VcbiAgfVxuICBpZiAoaXNzdWUubWVzc2FnZSA9PT0gXCJSZXF1aXJlZFwiKSB7XG4gICAgcmV0dXJuIGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9IGlzIHJlcXVpcmVkYFxuICB9XG4gIHJldHVybiBgJHtpc3N1ZS5tZXNzYWdlfSBmb3IgXCIke2lzc3VlLnBhdGguam9pbihcIi5cIil9XCJgXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSnNvblJlc3BvbnNlPEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueT4oXG4gIGpzb25SZXNwb25zZTogSnNvblJlc3BvbnNlIHwgdW5kZWZpbmVkLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVxuKSB7XG4gIGNvbnN0IG9yaWdpbmFsX3Jlc19qc29uID0gcmVzLmpzb25cbiAgY29uc3Qgb3ZlcnJpZGVfcmVzX2pzb24gPSAoanNvbjogYW55KSA9PiB7XG4gICAgY29uc3QgaXNfc3VjY2VzcyA9IHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMFxuICAgIGlmICghaXNfc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGpzb25SZXNwb25zZT8ucGFyc2UoanNvbilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX3Jlc3BvbnNlXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHdpdGgganNvblJlc3BvbnNlXCIsXG4gICAgICAgIHpvZEVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICB9XG4gIHJlcy5qc29uID0gb3ZlcnJpZGVfcmVzX2pzb25cbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhWYWxpZGF0aW9uID1cbiAgPFxuICAgIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgPihcbiAgICBpbnB1dDogUmVxdWVzdElucHV0PFxuICAgICAgSnNvbkJvZHksXG4gICAgICBRdWVyeVBhcmFtcyxcbiAgICAgIENvbW1vblBhcmFtcyxcbiAgICAgIEZvcm1EYXRhLFxuICAgICAgSnNvblJlc3BvbnNlXG4gICAgPlxuICApID0+XG4gIChuZXh0KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICAoaW5wdXQuZm9ybURhdGEgJiYgaW5wdXQuanNvbkJvZHkpIHx8XG4gICAgICAoaW5wdXQuZm9ybURhdGEgJiYgaW5wdXQuY29tbW9uUGFyYW1zKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBmb3JtRGF0YSB3aXRoIGpzb25Cb2R5IG9yIGNvbW1vblBhcmFtc1wiKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChyZXEubWV0aG9kID09PSBcIlBPU1RcIiB8fCByZXEubWV0aG9kID09PSBcIlBBVENIXCIpICYmXG4gICAgICAoaW5wdXQuanNvbkJvZHkgfHwgaW5wdXQuY29tbW9uUGFyYW1zKSAmJlxuICAgICAgIXJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdPy5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikgJiZcbiAgICAgICFfLmlzRW1wdHkocmVxLmJvZHkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYCR7cmVxLm1ldGhvZH0gcmVxdWVzdHMgbXVzdCBoYXZlIENvbnRlbnQtVHlwZSBoZWFkZXIgd2l0aCBcImFwcGxpY2F0aW9uL2pzb25cImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlucHV0LmZvcm1EYXRhICYmXG4gICAgICByZXEubWV0aG9kICE9PSBcIkdFVFwiICYmXG4gICAgICAhcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/LmluY2x1ZGVzKFxuICAgICAgICBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiXG4gICAgICApXG4gICAgICAvLyBUT0RPIGV2ZW50dWFsbHkgd2Ugc2hvdWxkIHN1cHBvcnQgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfY29udGVudF90eXBlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBNdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJgLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxfY29tYmluZWRfcGFyYW1zID0geyAuLi5yZXEucXVlcnksIC4uLnJlcS5ib2R5IH1cblxuICAgICAgY29uc3Qgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkgPSBpbnB1dC5zaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5XG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IHJlcS5tZXRob2QgIT09IFwiR0VUXCJcblxuICAgICAgY29uc3QgaXNGb3JtRGF0YSA9IEJvb2xlYW4oaW5wdXQuZm9ybURhdGEpXG5cbiAgICAgIGlmIChpc0Zvcm1EYXRhICYmIHdpbGxWYWxpZGF0ZVJlcXVlc3RCb2R5KSB7XG4gICAgICAgIHJlcS5ib2R5ID0gaW5wdXQuZm9ybURhdGE/LnBhcnNlKHJlcS5ib2R5KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5qc29uQm9keT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5xdWVyeVBhcmFtcykge1xuICAgICAgICByZXEucXVlcnkgPSBwYXJzZVF1ZXJ5UGFyYW1zKGlucHV0LnF1ZXJ5UGFyYW1zLCByZXEucXVlcnkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5jb21tb25QYXJhbXMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFzIGNvbW1vblBhcmFtcyBpbmNsdWRlcyBxdWVyeSBwYXJhbXMsIHdlIGNhbiB1c2UgdGhlIHBhcnNlUXVlcnlQYXJhbXMgZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIDsocmVxIGFzIGFueSkuY29tbW9uUGFyYW1zID0gcGFyc2VRdWVyeVBhcmFtcyhcbiAgICAgICAgICBpbnB1dC5jb21tb25QYXJhbXMsXG4gICAgICAgICAgb3JpZ2luYWxfY29tYmluZWRfcGFyYW1zXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gXCJab2RFcnJvclwiKSB7XG4gICAgICAgIGxldCBtZXNzYWdlXG4gICAgICAgIGlmIChlcnJvci5pc3N1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgaXNzdWUgPSBlcnJvci5pc3N1ZXNbMF1cbiAgICAgICAgICBtZXNzYWdlID0gem9kSXNzdWVUb1N0cmluZyhpc3N1ZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlX2NvbXBvbmVudHM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLnB1c2goem9kSXNzdWVUb1N0cmluZyhpc3N1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgYCR7ZXJyb3IuaXNzdWVzLmxlbmd0aH0gSW5wdXQgRXJyb3JzOiBgICtcbiAgICAgICAgICAgIG1lc3NhZ2VfY29tcG9uZW50cy5qb2luKFwiLCBcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICB0eXBlOiBcImludmFsaWRfaW5wdXRcIixcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHZhbGlkYXRpb25fZXJyb3JzOiBlcnJvci5mb3JtYXQoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfaW5wdXRcIixcbiAgICAgICAgbWVzc2FnZTogXCJFcnJvciB3aGlsZSBwYXJzaW5nIGlucHV0XCIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgd2lsbCBvdmVycmlkZSB0aGUgcmVzLmpzb24gbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSByZXNwb25zZVxuICAgICAqL1xuICAgIGlmIChpbnB1dC5zaG91bGRWYWxpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgdmFsaWRhdGVKc29uUmVzcG9uc2UoaW5wdXQuanNvblJlc3BvbnNlLCByZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQocmVxLCByZXMpXG4gIH1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFZhbGlkYXRpb25cbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVzcG9uc2UsIE5leHRBcGlSZXF1ZXN0IH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgTWlkZGxld2FyZSBhcyBXcmFwcGVyTWlkZGxld2FyZSB9IGZyb20gXCIuLi93cmFwcGVyc1wiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5pbXBvcnQgeyBIVFRQTWV0aG9kcyB9IGZyb20gXCIuLi93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzXCJcbmltcG9ydCB7XG4gIFNlY3VyaXR5U2NoZW1lT2JqZWN0LFxuICBTZWN1cml0eVJlcXVpcmVtZW50T2JqZWN0LFxufSBmcm9tIFwib3BlbmFwaTMtdHMvb2FzMzFcIlxuXG5leHBvcnQgdHlwZSBNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IFdyYXBwZXJNaWRkbGV3YXJlPFQsIERlcD4gJiB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBzZXR1cFBhcmFtc1xuICAgKi9cbiAgc2VjdXJpdHlTY2hlbWE/OiBTZWN1cml0eVNjaGVtZU9iamVjdFxuICBzZWN1cml0eU9iamVjdHM/OiBTZWN1cml0eVJlcXVpcmVtZW50T2JqZWN0W11cbn1cblxudHlwZSBQYXJhbURlZiA9IHouWm9kVHlwZUFueSB8IHouWm9kRWZmZWN0czx6LlpvZFR5cGVBbnk+XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVTcGVjPFxuICBBdXRoIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBNZXRob2RzIGV4dGVuZHMgSFRUUE1ldGhvZHNbXSA9IGFueSxcbiAgSnNvbkJvZHkgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgUXVlcnlQYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgQ29tbW9uUGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZE9iamVjdDxhbnksIGFueSwgYW55LCBhbnksIGFueT4sXG4gIE1pZGRsZXdhcmVzIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXSA9IGFueVtdLFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgRm9ybURhdGEgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueVxuPiB7XG4gIG1ldGhvZHM6IE1ldGhvZHNcbiAgYXV0aDogQXV0aFxuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIG1pZGRsZXdhcmVzPzogTWlkZGxld2FyZXNcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbn1cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUNoYWluT3V0cHV0PFxuICBNV0NoYWluIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXVxuPiA9IE1XQ2hhaW4gZXh0ZW5kcyByZWFkb25seSBbXVxuICA/IHt9XG4gIDogTVdDaGFpbiBleHRlbmRzIHJlYWRvbmx5IFtpbmZlciBGaXJzdCwgLi4uaW5mZXIgUmVzdF1cbiAgPyBGaXJzdCBleHRlbmRzIE1pZGRsZXdhcmU8aW5mZXIgVCwgYW55PlxuICAgID8gVCAmXG4gICAgICAgIChSZXN0IGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXVxuICAgICAgICAgID8gTWlkZGxld2FyZUNoYWluT3V0cHV0PFJlc3Q+XG4gICAgICAgICAgOiBuZXZlcilcbiAgICA6IG5ldmVyXG4gIDogbmV2ZXJcblxuZXhwb3J0IHR5cGUgQXV0aE1pZGRsZXdhcmVzID0ge1xuICBbYXV0aF90eXBlOiBzdHJpbmddOiBNaWRkbGV3YXJlPGFueSwgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwUGFyYW1zPFxuICBBdXRoTVcgZXh0ZW5kcyBBdXRoTWlkZGxld2FyZXMgPSBBdXRoTWlkZGxld2FyZXMsXG4gIEdsb2JhbE1XIGV4dGVuZHMgTWlkZGxld2FyZTxhbnksIGFueT5bXSA9IGFueVtdXG4+IHtcbiAgYXV0aE1pZGRsZXdhcmVNYXA6IEF1dGhNV1xuICBnbG9iYWxNaWRkbGV3YXJlczogR2xvYmFsTVdcbiAgZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlPzogKChuZXh0OiBGdW5jdGlvbikgPT4gRnVuY3Rpb24pIHwgbnVsbFxuXG4gIC8vIFRoZXNlIGltcHJvdmUgT3BlbkFQSSBnZW5lcmF0aW9uXG4gIGFwaU5hbWU6IHN0cmluZ1xuICBwcm9kdWN0aW9uU2VydmVyVXJsOiBzdHJpbmdcblxuICBhZGRPa1N0YXR1cz86IGJvb2xlYW5cblxuICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcz86IGJvb2xlYW5cbiAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keT86IGJvb2xlYW5cbiAgc2VjdXJpdHlTY2hlbWFzPzogUmVjb3JkPHN0cmluZywgU2VjdXJpdHlTY2hlbWVPYmplY3Q+XG4gIGdsb2JhbFNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGVBbnk+XG59XG5cbmNvbnN0IGRlZmF1bHRNaWRkbGV3YXJlTWFwID0ge1xuICBub25lOiAobmV4dCkgPT4gbmV4dCxcbn0gYXMgY29uc3RcblxudHlwZSBTZW5kPFQ+ID0gKGJvZHk6IFQpID0+IHZvaWRcbnR5cGUgTmV4dEFwaVJlc3BvbnNlV2l0aG91dEpzb25BbmRTdGF0dXNNZXRob2RzID0gT21pdDxcbiAgTmV4dEFwaVJlc3BvbnNlLFxuICBcImpzb25cIiB8IFwic3RhdHVzXCJcbj5cblxudHlwZSBTdWNjZXNzZnVsTmV4dEFwaVJlc3BvbnNlTWV0aG9kczxUPiA9IHtcbiAgc3RhdHVzOiAoXG4gICAgc3RhdHVzQ29kZTogMjAwIHwgMjAxXG4gICkgPT4gTmV4dEFwaVJlc3BvbnNlV2l0aG91dEpzb25BbmRTdGF0dXNNZXRob2RzICYge1xuICAgIGpzb246IFNlbmQ8VD5cbiAgfVxuICBqc29uOiBTZW5kPFQ+XG59XG5cbnR5cGUgRXJyb3JOZXh0QXBpUmVzcG9uc2VNZXRob2RzID0ge1xuICBzdGF0dXM6IChzdGF0dXNDb2RlOiBudW1iZXIpID0+IE5leHRBcGlSZXNwb25zZVdpdGhvdXRKc29uQW5kU3RhdHVzTWV0aG9kcyAmIHtcbiAgICBqc29uOiBTZW5kPGFueT5cbiAgfVxuICBqc29uOiBTZW5kPGFueT5cbn1cblxuZXhwb3J0IHR5cGUgUm91dGVGdW5jdGlvbjxcbiAgU1AgZXh0ZW5kcyBTZXR1cFBhcmFtczxBdXRoTWlkZGxld2FyZXM+LFxuICBSUyBleHRlbmRzIFJvdXRlU3BlY1xuPiA9IChcbiAgcmVxOiAoU1BbXCJhdXRoTWlkZGxld2FyZU1hcFwiXSAmXG4gICAgdHlwZW9mIGRlZmF1bHRNaWRkbGV3YXJlTWFwKVtSU1tcImF1dGhcIl1dIGV4dGVuZHMgTWlkZGxld2FyZTxcbiAgICBpbmZlciBBdXRoTVdPdXQsXG4gICAgYW55XG4gID5cbiAgICA/IE9taXQ8TmV4dEFwaVJlcXVlc3QsIFwicXVlcnlcIiB8IFwiYm9keVwiPiAmXG4gICAgICAgIEF1dGhNV091dCAmXG4gICAgICAgIE1pZGRsZXdhcmVDaGFpbk91dHB1dDxcbiAgICAgICAgICBSU1tcIm1pZGRsZXdhcmVzXCJdIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXVxuICAgICAgICAgICAgPyBbLi4uU1BbXCJnbG9iYWxNaWRkbGV3YXJlc1wiXSwgLi4uUlNbXCJtaWRkbGV3YXJlc1wiXV1cbiAgICAgICAgICAgIDogU1BbXCJnbG9iYWxNaWRkbGV3YXJlc1wiXVxuICAgICAgICA+ICYge1xuICAgICAgICAgIGJvZHk6IFJTW1wiZm9ybURhdGFcIl0gZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgICAgICAgICAgID8gei5pbmZlcjxSU1tcImZvcm1EYXRhXCJdPlxuICAgICAgICAgICAgOiBSU1tcImpzb25Cb2R5XCJdIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gICAgICAgICAgICA/IHouaW5mZXI8UlNbXCJqc29uQm9keVwiXT5cbiAgICAgICAgICAgIDoge31cbiAgICAgICAgICBxdWVyeTogUlNbXCJxdWVyeVBhcmFtc1wiXSBleHRlbmRzIHouWm9kVHlwZUFueVxuICAgICAgICAgICAgPyB6LmluZmVyPFJTW1wicXVlcnlQYXJhbXNcIl0+XG4gICAgICAgICAgICA6IHt9XG4gICAgICAgICAgY29tbW9uUGFyYW1zOiBSU1tcImNvbW1vblBhcmFtc1wiXSBleHRlbmRzIHouWm9kVHlwZUFueVxuICAgICAgICAgICAgPyB6LmluZmVyPFJTW1wiY29tbW9uUGFyYW1zXCJdPlxuICAgICAgICAgICAgOiB7fVxuICAgICAgICB9XG4gICAgOiBgdW5rbm93biBhdXRoIHR5cGU6ICR7UlNbXCJhdXRoXCJdfS4gWW91IHNob3VsZCBjb25maWd1cmUgdGhpcyBhdXRoIHR5cGUgaW4geW91ciBhdXRoX21pZGRsZXdhcmVzIHcvIGNyZWF0ZVdpdGhSb3V0ZVNwZWMsIG9yIG1heWJlIHlvdSBuZWVkIHRvIGFkZCBcImFzIGNvbnN0XCIgdG8geW91ciByb3V0ZSBzcGVjIGRlZmluaXRpb24uYCxcbiAgcmVzOiBOZXh0QXBpUmVzcG9uc2VXaXRob3V0SnNvbkFuZFN0YXR1c01ldGhvZHMgJlxuICAgIFN1Y2Nlc3NmdWxOZXh0QXBpUmVzcG9uc2VNZXRob2RzPFxuICAgICAgUlNbXCJqc29uUmVzcG9uc2VcIl0gZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgICAgICAgPyB6LmluZmVyPFJTW1wianNvblJlc3BvbnNlXCJdPlxuICAgICAgICA6IGFueVxuICAgID4gJlxuICAgIEVycm9yTmV4dEFwaVJlc3BvbnNlTWV0aG9kc1xuKSA9PiBQcm9taXNlPHZvaWQ+XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbiA9IDxcbiAgU1AgZXh0ZW5kcyBTZXR1cFBhcmFtczxBdXRoTWlkZGxld2FyZXMsIGFueT5cbj4oXG4gIHNldHVwUGFyYW1zOiBTUFxuKSA9PiA8XG4gIFJTIGV4dGVuZHMgUm91dGVTcGVjPFxuICAgIHN0cmluZyxcbiAgICBhbnksXG4gICAgYW55LFxuICAgIGFueSxcbiAgICBhbnksXG4gICAgYW55LFxuICAgIHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgICBhbnlcbiAgPlxuPihcbiAgcm91dGVfc3BlYzogUlNcbikgPT4gKG5leHQ6IFJvdXRlRnVuY3Rpb248U1AsIFJTPikgPT4gYW55XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7QUNBQTs7O0FDQUE7QUFpVU8sSUFBTSxXQUFxQixJQUFJLGlCQUF3QjtBQUM1RCxRQUFNLGtCQUFrQixhQUFhLGFBQWEsU0FBUztBQUMzRCxRQUFNLE1BQU0sYUFBYSxNQUFNLEdBQUcsRUFBRTtBQUVwQyxNQUFJLHNCQUFzQjtBQUMxQixXQUFTLElBQUksSUFBSSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDeEMsMEJBQXVCLElBQUksR0FBVyxtQkFBbUI7QUFBQSxFQUMzRDtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU8sbUJBQVE7OztBQzdVZjtBQVdPLElBQU0sY0FBYyxDQUFDLFlBQTJCLENBQUMsU0FBUyxDQUFDLEtBQUssUUFBUTtBQUM3RSxNQUFJLENBQUMsUUFBUSxTQUFTLElBQUksTUFBTSxHQUFHO0FBQ2pDLFVBQU0sSUFBSSwwQkFBMEI7QUFBQSxNQUNsQyxNQUFNO0FBQUEsTUFDTixTQUFTLFFBQVEsUUFBUSxLQUFLLEdBQUc7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU8sS0FBSyxLQUFLLEdBQUc7QUFDdEI7QUFFQSxJQUFPLHVCQUFROzs7QUNyQmY7QUFDQSxTQUFTLEdBQUcsNkJBQTZCO0FBQ3pDLE9BQU8s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QU0sc0JBQW9ELENBQy9ELGdCQUNHO0FBQ0gsUUFBTTtBQUFBLElBQ0osb0JBQW9CLENBQUM7QUFBQSxJQUNyQixvQkFBb0IsQ0FBQztBQUFBLElBQ3JCO0FBQUEsSUFDQSwrQkFBK0I7QUFBQSxJQUMvQiw4QkFBOEIsc0JBQXNCO0FBQUEsTUFDbEQsYUFBYSxZQUFZO0FBQUEsTUFDekIsMEJBQTBCO0FBQUEsUUFDeEIsaUJBQWlCLENBQUMsS0FBSyxVQUFVO0FBQy9CLGNBQUksUUFBUSxJQUFJLGFBQWEsY0FBYztBQUN6QyxtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUVBLGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELGdCQUFnQixZQUFZLGNBQ3hCO0FBQUEsTUFDRSxJQUFJQSxHQUFFLFFBQVE7QUFBQSxJQUNoQixJQUNBLENBQUM7QUFBQSxFQUNQLElBQUk7QUFFSixRQUFNLGdCQUFnQixDQUFDLFNBQW9CO0FBQ3pDLFVBQU0sb0JBQW9CLENBQUMsdUJBQXVCO0FBQ2hELFlBQU0scUJBQXFCLE9BQ3pCLEtBQ0EsUUFDRztBQUNILDBCQUFrQixVQUFVLENBQUMsU0FBUztBQUV0QyxjQUFNLGtCQUFrQixrQkFBa0IsS0FBSztBQUMvQyxZQUFJLENBQUM7QUFBaUIsZ0JBQU0sSUFBSSxNQUFNLHNCQUFzQixLQUFLLE1BQU07QUFFdkUsZUFBTztBQUFBLFVBQ0wsR0FBSyw4QkFDRCxDQUFDLDJCQUEyQixJQUM1QixDQUFDO0FBQUEsVUFDTCxHQUFLLHFCQUFxQixDQUFDO0FBQUEsVUFDM0I7QUFBQSxVQUNBLEdBQUssS0FBSyxlQUFlLENBQUM7QUFBQSxVQUMxQixxQkFBWSxLQUFLLE9BQU87QUFBQSxVQUN4Qix3QkFBZTtBQUFBLFlBQ2IsVUFBVSxLQUFLO0FBQUEsWUFDZixhQUFhLEtBQUs7QUFBQSxZQUNsQixjQUFjLEtBQUs7QUFBQSxZQUNuQixVQUFVLEtBQUs7QUFBQSxZQUNmLGNBQWMsS0FBSztBQUFBLFlBQ25CO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFVBQ0Q7QUFBQSxRQUNGLEVBQUUsS0FBWSxHQUFHO0FBQUEsTUFDbkI7QUFFQSx5QkFBbUIsZUFBZTtBQUNsQyx5QkFBbUIsYUFBYTtBQUVoQyxhQUFPO0FBQUEsSUFDVDtBQUVBLHNCQUFrQixlQUFlO0FBQ2pDLHNCQUFrQixhQUFhO0FBRS9CLFdBQU87QUFBQSxFQUNUO0FBRUEsZ0JBQWMsZUFBZTtBQUU3QixTQUFPO0FBQ1Q7OztBSXRIQTsiLAogICJuYW1lcyI6IFsieiJdCn0K
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvaW5kZXgudHMiLCAiLi4vc3JjL3dyYXBwZXJzL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzLnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uLnRzIiwgIi4uL3NyYy90eXBlcy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpdGgtcm91dGUtc3BlY1wiXG5leHBvcnQgeyB3cmFwcGVycyB9IGZyb20gXCIuL3dyYXBwZXJzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCJcbiIsICJpbXBvcnQgeyBOZXh0QXBpUmVzcG9uc2UsIE5leHRBcGlSZXF1ZXN0IH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgd2l0aEV4Y2VwdGlvbkhhbmRsaW5nIH0gZnJvbSBcIi4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5pbXBvcnQgd3JhcHBlcnMsIHsgTWlkZGxld2FyZSB9IGZyb20gXCIuLi93cmFwcGVyc1wiXG5pbXBvcnQge1xuICBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24sXG4gIFF1ZXJ5QXJyYXlGb3JtYXRzLFxuICBSb3V0ZVNwZWMsXG59IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgd2l0aE1ldGhvZHMsIHsgSFRUUE1ldGhvZHMgfSBmcm9tIFwiLi9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHNcIlxuaW1wb3J0IHdpdGhWYWxpZGF0aW9uIGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtdmFsaWRhdGlvblwiXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiXG5cbnR5cGUgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnkgfCB6LlpvZEVmZmVjdHM8ei5ab2RUeXBlQW55PlxuXG5leHBvcnQgY29uc3QgY2hlY2tSb3V0ZVNwZWMgPSA8XG4gIEF1dGhUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBNZXRob2RzIGV4dGVuZHMgSFRUUE1ldGhvZHNbXSA9IEhUVFBNZXRob2RzW10sXG4gIEpzb25Cb2R5IGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIENvbW1vblBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBNaWRkbGV3YXJlcyBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmU8YW55LCBhbnk+W10gPSByZWFkb25seSBNaWRkbGV3YXJlPFxuICAgIGFueSxcbiAgICBhbnlcbiAgPltdLFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBTcGVjIGV4dGVuZHMgUm91dGVTcGVjPFxuICAgIEF1dGhUeXBlLFxuICAgIE1ldGhvZHMsXG4gICAgSnNvbkJvZHksXG4gICAgUXVlcnlQYXJhbXMsXG4gICAgQ29tbW9uUGFyYW1zLFxuICAgIE1pZGRsZXdhcmVzLFxuICAgIEZvcm1EYXRhXG4gID4gPSBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPlxuPihcbiAgc3BlYzogU3BlY1xuKTogc3RyaW5nIGV4dGVuZHMgU3BlY1tcImF1dGhcIl1cbiAgPyBgeW91ciByb3V0ZSBzcGVjIGlzIHVuZGVyc3BlY2lmaWVkLCBhZGQgXCJhcyBjb25zdFwiYFxuICA6IFNwZWMgPT4gc3BlYyBhcyBhbnlcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVJSQVlfRk9STUFUUzogUXVlcnlBcnJheUZvcm1hdHMgPSBbXG4gIFwiYnJhY2tldHNcIixcbiAgXCJjb21tYVwiLFxuICBcInJlcGVhdFwiLFxuXVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2l0aFJvdXRlU3BlYzogQ3JlYXRlV2l0aFJvdXRlU3BlY0Z1bmN0aW9uID0gKChcbiAgc2V0dXBQYXJhbXNcbikgPT4ge1xuICBjb25zdCB7XG4gICAgYXV0aE1pZGRsZXdhcmVNYXAgPSB7fSxcbiAgICBnbG9iYWxNaWRkbGV3YXJlcyA9IFtdLFxuICAgIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzLFxuICAgIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHkgPSB0cnVlLFxuICAgIGV4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZSA9IHdpdGhFeGNlcHRpb25IYW5kbGluZyh7XG4gICAgICBhZGRPa1N0YXR1czogc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXMsXG4gICAgICBleGNlcHRpb25IYW5kbGluZ09wdGlvbnM6IHtcbiAgICAgICAgZ2V0RXJyb3JDb250ZXh0OiAocmVxLCBlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBlcnJvclxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSBhcyBhbnksXG4gICAgZ2xvYmFsU2NoZW1hcyA9IHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzXG4gICAgICA/IHtcbiAgICAgICAgICBvazogei5ib29sZWFuKCksXG4gICAgICAgIH1cbiAgICAgIDoge30sXG4gICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzID0gREVGQVVMVF9BUlJBWV9GT1JNQVRTLFxuICB9ID0gc2V0dXBQYXJhbXNcblxuICBjb25zdCB3aXRoUm91dGVTcGVjID0gKHNwZWM6IFJvdXRlU3BlYykgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZVJvdXRlRXhwb3J0ID0gKHVzZXJEZWZpbmVkUm91dGVGbikgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlcXVlc3RIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgICAgICByZXM6IE5leHRBcGlSZXNwb25zZVxuICAgICAgKSA9PiB7XG4gICAgICAgIGF1dGhNaWRkbGV3YXJlTWFwW1wibm9uZVwiXSA9IChuZXh0KSA9PiBuZXh0XG5cbiAgICAgICAgY29uc3QgYXV0aF9taWRkbGV3YXJlID0gYXV0aE1pZGRsZXdhcmVNYXBbc3BlYy5hdXRoXVxuICAgICAgICBpZiAoIWF1dGhfbWlkZGxld2FyZSkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF1dGggdHlwZTogJHtzcGVjLmF1dGh9YClcblxuICAgICAgICByZXR1cm4gd3JhcHBlcnMoXG4gICAgICAgICAgLi4uKChleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmVcbiAgICAgICAgICAgID8gW2V4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZV1cbiAgICAgICAgICAgIDogW10pIGFzIFthbnldKSxcbiAgICAgICAgICAuLi4oKGdsb2JhbE1pZGRsZXdhcmVzIHx8IFtdKSBhcyBbXSksXG4gICAgICAgICAgYXV0aF9taWRkbGV3YXJlLFxuICAgICAgICAgIC4uLigoc3BlYy5taWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIHdpdGhNZXRob2RzKHNwZWMubWV0aG9kcyksXG4gICAgICAgICAgd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICAgICAganNvbkJvZHk6IHNwZWMuanNvbkJvZHksXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogc3BlYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGNvbW1vblBhcmFtczogc3BlYy5jb21tb25QYXJhbXMsXG4gICAgICAgICAgICBmb3JtRGF0YTogc3BlYy5mb3JtRGF0YSxcbiAgICAgICAgICAgIGpzb25SZXNwb25zZTogc3BlYy5qc29uUmVzcG9uc2UsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICAgICAgICAgIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHksXG4gICAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdXNlckRlZmluZWRSb3V0ZUZuXG4gICAgICAgICkocmVxIGFzIGFueSwgcmVzKVxuICAgICAgfVxuXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgICByZXR1cm4gcm9vdFJlcXVlc3RIYW5kbGVyXG4gICAgfVxuXG4gICAgY3JlYXRlUm91dGVFeHBvcnQuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlRXhwb3J0XG4gIH1cblxuICB3aXRoUm91dGVTcGVjLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG5cbiAgcmV0dXJuIHdpdGhSb3V0ZVNwZWNcbn0pIGFzIGFueVxuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QgYXMgUmVxLCBOZXh0QXBpUmVzcG9uc2UgYXMgUmVzIH0gZnJvbSBcIm5leHRcIlxuLypcblxuV3JhcHMgYSBmdW5jdGlvbiBpbiBsYXllcnMgb2Ygb3RoZXIgZnVuY3Rpb25zLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBpbnB1dC9vdXRwdXRcbnR5cGUuIFRoZSBvdXRwdXQgb2Ygd3JhcHBlcnMgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdHlwZSBvZiBpdCdzIGxhc3QgcGFyYW1ldGVyXG4odGhlIHdyYXBwZWQgZnVuY3Rpb24pXG5cblRoaXMgZnVuY3Rpb24gdHVybnMgdGhpcyB0eXBlIG9mIGNvbXBvc2l0aW9uLi4uXG5cbmxvZ2dlci53aXRoQ29udGV4dChcInNvbWVjb250ZXh0XCIpKFxuICBhc3luYyAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhXG4gIH1cbilcblxuSW50by4uLlxuXG53cmFwcGVycyhcbiAgbG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIiksXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5IYXZpbmcgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kIGhlbHBzIHByZXNlcnZlIHR5cGVzLCB3aGljaCBvdGhlcndpc2UgY2FuIGdldFxubWVzc2VkIHVwIGJ5IHRoZSBtaWRkbGV3YXJlcy4gSXQgYWxzbyBjYW4gbWFrZSB0aGUgY29kZSBjbGVhbmVyIHdoZXJlIHRoZXJlIGFyZVxubXVsdGlwbGUgd3JhcHBlcnMuXG5cbiMjIEVYQU1QTEVTXG5cbkluIHRoZSBjb250ZXh0IG9mIHJlcXVlc3QgbWlkZGxld2FyZSB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcy4uLlxuXG5jb25zdCB3aXRoUmVxdWVzdExvZ2dpbmdNaWRkbGV3YXJlID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICBjb25zb2xlLmxvZyhgR09UIFJFUVVFU1QgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofWApXG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIHdyYXBwZXIgdGhhdCB0YWtlcyBzb21lIHBhcmFtZXRlcnMuLi5cblxuY29uc3Qgd2l0aExvZ2dlZEFyZ3VtZW50cyA9XG4gICAgKGxvZ1ByZWZpeDogc3RyaW5nKSA9PlxuICAgIChuZXh0KSA9PlxuICAgIGFzeW5jICguLi5mdW5jQXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2cobG9nUHJlZml4LCAuLi5mdW5jQXJncylcbiAgICAgIHJldHVybiBuZXh0KC4uLmZ1bmNBcmdzKVxuICAgIH1cblxuKi9cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZTxULCBEZXAgPSB7fT4gPSAoXG4gIG5leHQ6IChyZXE6IFJlcSAmIERlcCAmIFQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuXG4vLyBTYWZlciBNaWRkbGV3YXJlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgZXh0ZW5kUmVxdWVzdCB0byBlbnN1cmUgdGhhdCB0aGVcbi8vIG5ldyBjb250ZXh0IChUKSB3YXMgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHJlcXVlc3QuIEl0J3Mga2luZCBvZiBhbm5veWluZ1xuLy8gdG8gdXNlIGluIHByYWN0aWNlLCBzbyB3ZSBkb24ndCB1c2UgaXQgZm9yIG91ciBXcmFwcGVycyAoeWV0KVxuZXhwb3J0IHR5cGUgU2FmZXJNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAsIHJlczogUmVzKSA9PiBhbnlcblxuZXhwb3J0IGNvbnN0IGV4dGVuZFJlcXVlc3QgPSA8VCBleHRlbmRzIFJlcSwgSyBleHRlbmRzIHt9PihcbiAgcmVxOiBULFxuICBtZXJnZTogS1xuKTogVCAmIEsgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlKSkge1xuICAgIDsocmVxIGFzIGFueSlba2V5XSA9IHZcbiAgfVxuICByZXR1cm4gcmVxIGFzIGFueVxufVxuXG50eXBlIFdyYXBwZXJzMSA9IDxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnMyID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgZW5kcG9pbnQ6IChyZXE6IFJlcSAmIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFRPRE8gZmlndXJlIG91dCBob3cgdG8gZG8gYSByZWN1cnNpdmUgZGVmaW5pdGlvbiwgb3Igb25lIHRoYXQgc2ltcGxpZmllc1xuLy8gdGhlc2UgcmVkdW5kYW50IHdyYXBwZXJzXG5cbnR5cGUgV3JhcHBlcnMzID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNCA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczUgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczYgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXAsXG4gIE13NlJlcXVlc3RDb250ZXh0LFxuICBNdzZEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc2OiBNaWRkbGV3YXJlPFxuICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc2RGVwXG4gICAgICA/IE13NkRlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNyA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcCxcbiAgTXc3UmVxdWVzdENvbnRleHQsXG4gIE13N0RlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NzogTWlkZGxld2FyZTxcbiAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13N0RlcFxuICAgICAgPyBNdzdEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVycyA9IFdyYXBwZXJzMSAmXG4gIFdyYXBwZXJzMiAmXG4gIFdyYXBwZXJzMyAmXG4gIFdyYXBwZXJzNCAmXG4gIFdyYXBwZXJzNSAmXG4gIFdyYXBwZXJzNiAmXG4gIFdyYXBwZXJzN1xuXG5leHBvcnQgY29uc3Qgd3JhcHBlcnM6IFdyYXBwZXJzID0gKC4uLndyYXBwZXJzQXJnczogYW55W10pID0+IHtcbiAgY29uc3Qgd3JhcHBlZEZ1bmN0aW9uID0gd3JhcHBlcnNBcmdzW3dyYXBwZXJzQXJncy5sZW5ndGggLSAxXVxuICBjb25zdCBtd3MgPSB3cmFwcGVyc0FyZ3Muc2xpY2UoMCwgLTEpXG5cbiAgbGV0IGxhc3RXcmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVkRnVuY3Rpb25cbiAgZm9yIChsZXQgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxhc3RXcmFwcGVkRnVuY3Rpb24gPSAobXdzW2ldIGFzIGFueSkobGFzdFdyYXBwZWRGdW5jdGlvbilcbiAgfVxuXG4gIHJldHVybiBsYXN0V3JhcHBlZEZ1bmN0aW9uXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJzXG4iLCAiaW1wb3J0IHsgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5leHBvcnQgdHlwZSBIVFRQTWV0aG9kcyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG5cbmV4cG9ydCBjb25zdCB3aXRoTWV0aG9kcyA9IChtZXRob2RzOiBIVFRQTWV0aG9kc1tdKSA9PiAobmV4dCkgPT4gKHJlcSwgcmVzKSA9PiB7XG4gIGlmICghbWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKHtcbiAgICAgIHR5cGU6IFwibWV0aG9kX25vdF9hbGxvd2VkXCIsXG4gICAgICBtZXNzYWdlOiBgb25seSAke21ldGhvZHMuam9pbihcIixcIil9IGFjY2VwdGVkYCxcbiAgICB9KVxuICB9XG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoTWV0aG9kc1xuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHosIFpvZEZpcnN0UGFydHlUeXBlS2luZCB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgUXVlcnlBcnJheUZvcm1hdHMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgREVGQVVMVF9BUlJBWV9GT1JNQVRTIH0gZnJvbSBcIi4uXCJcblxuY29uc3QgZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYSA9IChcbiAgaXNab2RFZmZlY3Q6IGJvb2xlYW4sXG4gIHNjaGVtYTogei5ab2RUeXBlQW55XG4pOiB6LlpvZFR5cGVBbnkgfCB6LlpvZE9iamVjdDxhbnk+ID0+IHtcbiAgaWYgKCFpc1pvZEVmZmVjdCkge1xuICAgIHJldHVybiBzY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuICB9XG5cbiAgbGV0IGN1cnJlbnRTY2hlbWEgPSBzY2hlbWFcblxuICB3aGlsZSAoY3VycmVudFNjaGVtYSBpbnN0YW5jZW9mIHouWm9kRWZmZWN0cykge1xuICAgIGN1cnJlbnRTY2hlbWEgPSBjdXJyZW50U2NoZW1hLl9kZWYuc2NoZW1hXG4gIH1cblxuICByZXR1cm4gY3VycmVudFNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzY2hlbWEgZnJvbSBhIFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbCBzY2hlbWEuXG4gKiBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgYWxsIHNwZWNpYWwgY2FzZXMgb2YgWm9kU2NoZW1hIGFuZCBub3QganVzdCBab2RFZmZlY3QgfCBab2REZWZhdWx0IHwgWm9kT3B0aW9uYWxcbiAqL1xuY29uc3QgZ2V0Wm9kRGVmRnJvbVpvZFNjaGVtYUhlbHBlcnMgPSAoc2NoZW1hOiB6LlpvZFR5cGVBbnkpID0+IHtcbiAgY29uc3Qgc3BlY2lhbF96b2RfdHlwZXMgPSBbXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICBdXG5cbiAgd2hpbGUgKHNwZWNpYWxfem9kX3R5cGVzLmluY2x1ZGVzKHNjaGVtYS5fZGVmLnR5cGVOYW1lKSkge1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwgfHxcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdFxuICAgICkge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuaW5uZXJUeXBlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5fZGVmLnNjaGVtYVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5fZGVmXG59XG5cbmNvbnN0IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0ID0gKFxuICBzY2hlbWE6IHouWm9kVHlwZUFueVxuKTogei5ab2RPYmplY3Q8YW55PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGlzWm9kRWZmZWN0ID0gc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gIGNvbnN0IHNhZmVfc2NoZW1hID0gZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYShpc1pvZEVmZmVjdCwgc2NoZW1hKVxuICBjb25zdCBpc1pvZE9iamVjdCA9XG4gICAgc2FmZV9zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdFxuXG4gIGlmICghaXNab2RPYmplY3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gc2FmZV9zY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxufVxuXG5jb25zdCBpc1pvZFNjaGVtYUFycmF5ID0gKHNjaGVtYTogei5ab2RUeXBlQW55KSA9PiB7XG4gIGNvbnN0IGRlZiA9IGdldFpvZERlZkZyb21ab2RTY2hlbWFIZWxwZXJzKHNjaGVtYSlcbiAgcmV0dXJuIGRlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5XG59XG5cbmNvbnN0IGlzWm9kU2NoZW1hQm9vbGVhbiA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCBkZWYgPSBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyhzY2hlbWEpXG4gIHJldHVybiBkZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCb29sZWFuXG59XG5cbmNvbnN0IHBhcnNlUXVlcnlQYXJhbXMgPSAoXG4gIHNjaGVtYTogei5ab2RUeXBlQW55LFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHN1cHBvcnRlZEFycmF5Rm9ybWF0czogUXVlcnlBcnJheUZvcm1hdHNcbikgPT4ge1xuICBjb25zdCBwYXJzZWRfaW5wdXQgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dClcbiAgY29uc3Qgb2JqX3NjaGVtYSA9IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0KHNjaGVtYSlcblxuICBpZiAob2JqX3NjaGVtYSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9ial9zY2hlbWEuc2hhcGUpKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheSh2YWx1ZSBhcyB6LlpvZFR5cGVBbnkpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5X2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJjb21tYVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IGFycmF5X2lucHV0LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPSBpbnB1dFtgJHtrZXl9W11gXVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzLmluY2x1ZGVzKFwiYnJhY2tldHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJlX3NwbGl0X2FycmF5ID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IHByZV9zcGxpdF9hcnJheS5zcGxpdChcIixcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0KSAmJlxuICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcImJyYWNrZXRzXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1pvZFNjaGVtYUJvb2xlYW4odmFsdWUgYXMgei5ab2RUeXBlQW55KSkge1xuICAgICAgICBjb25zdCBib29sZWFuX2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYm9vbGVhbl9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYm9vbGVhbl9pbnB1dCA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY2hlbWEucGFyc2UocGFyc2VkX2lucHV0KVxufVxuXG5jb25zdCB2YWxpZGF0ZVF1ZXJ5UGFyYW1zID0gKFxuICBpbnB1dFVybDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZUFueSxcbiAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzOiBRdWVyeUFycmF5Rm9ybWF0c1xuKSA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoaW5wdXRVcmwsIFwiaHR0cDovL2R1bW15LmNvbVwiKVxuXG4gIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBjb25zdCBvYmpfc2NoZW1hID0gdHJ5R2V0Wm9kU2NoZW1hQXNPYmplY3Qoc2NoZW1hKVxuICBpZiAoIW9ial9zY2hlbWEpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIHVybC5zZWFyY2hQYXJhbXMua2V5cygpKSB7XG4gICAgZm9yIChjb25zdCBbc2NoZW1hS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGlmIChpc1pvZFNjaGVtYUFycmF5KHZhbHVlIGFzIHouWm9kVHlwZUFueSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gYCR7c2NoZW1hS2V5fVtdYCAmJlxuICAgICAgICAgICFzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJicmFja2V0c1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBcImludmFsaWRfcXVlcnlfcGFyYW1zXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQnJhY2tldCBzeW50YXggbm90IHN1cHBvcnRlZCBmb3IgcXVlcnkgcGFyYW0gXCIke3NjaGVtYUtleX1cImAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGtleV9zY2hlbWEgPSBvYmpfc2NoZW1hLnNoYXBlW2tleV1cblxuICAgIGlmIChrZXlfc2NoZW1hKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheShrZXlfc2NoZW1hKSkge1xuICAgICAgICBpZiAoc2VlbktleXMuaGFzKGtleSkgJiYgIXN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcInJlcGVhdFwiKSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9xdWVyeV9wYXJhbXNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXBlYXRlZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQgZm9yIGR1cGxpY2F0ZSBxdWVyeSBwYXJhbSBcIiR7a2V5fVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VlbktleXMuYWRkKGtleSlcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnB1dDxcbiAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbj4ge1xuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxuICBzdXBwb3J0ZWRBcnJheUZvcm1hdHM/OiBRdWVyeUFycmF5Rm9ybWF0c1xufVxuXG5jb25zdCB6b2RJc3N1ZVRvU3RyaW5nID0gKGlzc3VlOiB6LlpvZElzc3VlKSA9PiB7XG4gIGlmIChpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2VcbiAgfVxuICBpZiAoaXNzdWUubWVzc2FnZSA9PT0gXCJSZXF1aXJlZFwiKSB7XG4gICAgcmV0dXJuIGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9IGlzIHJlcXVpcmVkYFxuICB9XG4gIHJldHVybiBgJHtpc3N1ZS5tZXNzYWdlfSBmb3IgXCIke2lzc3VlLnBhdGguam9pbihcIi5cIil9XCJgXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSnNvblJlc3BvbnNlPEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueT4oXG4gIGpzb25SZXNwb25zZTogSnNvblJlc3BvbnNlIHwgdW5kZWZpbmVkLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVxuKSB7XG4gIGNvbnN0IG9yaWdpbmFsX3Jlc19qc29uID0gcmVzLmpzb25cbiAgY29uc3Qgb3ZlcnJpZGVfcmVzX2pzb24gPSAoanNvbjogYW55KSA9PiB7XG4gICAgY29uc3QgaXNfc3VjY2VzcyA9IHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMFxuICAgIGlmICghaXNfc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGpzb25SZXNwb25zZT8ucGFyc2UoanNvbilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX3Jlc3BvbnNlXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHdpdGgganNvblJlc3BvbnNlXCIsXG4gICAgICAgIHpvZEVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICB9XG4gIHJlcy5qc29uID0gb3ZlcnJpZGVfcmVzX2pzb25cbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhWYWxpZGF0aW9uID1cbiAgPFxuICAgIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgPihcbiAgICBpbnB1dDogUmVxdWVzdElucHV0PFxuICAgICAgSnNvbkJvZHksXG4gICAgICBRdWVyeVBhcmFtcyxcbiAgICAgIENvbW1vblBhcmFtcyxcbiAgICAgIEZvcm1EYXRhLFxuICAgICAgSnNvblJlc3BvbnNlXG4gICAgPlxuICApID0+XG4gIChuZXh0KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB7IHN1cHBvcnRlZEFycmF5Rm9ybWF0cyA9IERFRkFVTFRfQVJSQVlfRk9STUFUUyB9ID0gaW5wdXRcblxuICAgIGlmIChcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5qc29uQm9keSkgfHxcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5jb21tb25QYXJhbXMpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGZvcm1EYXRhIHdpdGgganNvbkJvZHkgb3IgY29tbW9uUGFyYW1zXCIpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHJlcS5tZXRob2QgPT09IFwiUE9TVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiUEFUQ0hcIikgJiZcbiAgICAgIChpbnB1dC5qc29uQm9keSB8fCBpbnB1dC5jb21tb25QYXJhbXMpICYmXG4gICAgICAhcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSAmJlxuICAgICAgIV8uaXNFbXB0eShyZXEuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2NvbnRlbnRfdHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgJHtyZXEubWV0aG9kfSByZXF1ZXN0cyBtdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24vanNvblwiYCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaW5wdXQuZm9ybURhdGEgJiZcbiAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXG4gICAgICAgIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIClcbiAgICAgIC8vIFRPRE8gZXZlbnR1YWxseSB3ZSBzaG91bGQgc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYE11c3QgaGF2ZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMgPSB7IC4uLnJlcS5xdWVyeSwgLi4ucmVxLmJvZHkgfVxuXG4gICAgICBjb25zdCB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSA9IGlucHV0LnNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHlcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogcmVxLm1ldGhvZCAhPT0gXCJHRVRcIlxuXG4gICAgICBjb25zdCBpc0Zvcm1EYXRhID0gQm9vbGVhbihpbnB1dC5mb3JtRGF0YSlcblxuICAgICAgaWYgKGlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5mb3JtRGF0YT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmICghaXNGb3JtRGF0YSAmJiB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXEuYm9keSA9IGlucHV0Lmpzb25Cb2R5Py5wYXJzZShyZXEuYm9keSlcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LnF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIGlmICghcmVxLnVybCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlcS51cmwgaXMgdW5kZWZpbmVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZVF1ZXJ5UGFyYW1zKHJlcS51cmwsIGlucHV0LnF1ZXJ5UGFyYW1zLCBzdXBwb3J0ZWRBcnJheUZvcm1hdHMpXG5cbiAgICAgICAgcmVxLnF1ZXJ5ID0gcGFyc2VRdWVyeVBhcmFtcyhcbiAgICAgICAgICBpbnB1dC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICByZXEucXVlcnksXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LmNvbW1vblBhcmFtcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXMgY29tbW9uUGFyYW1zIGluY2x1ZGVzIHF1ZXJ5IHBhcmFtcywgd2UgY2FuIHVzZSB0aGUgcGFyc2VRdWVyeVBhcmFtcyBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgOyhyZXEgYXMgYW55KS5jb21tb25QYXJhbXMgPSBwYXJzZVF1ZXJ5UGFyYW1zKFxuICAgICAgICAgIGlucHV0LmNvbW1vblBhcmFtcyxcbiAgICAgICAgICBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMsXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYWRSZXF1ZXN0RXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSBcIlpvZEVycm9yXCIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yLmlzc3Vlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBpc3N1ZSA9IGVycm9yLmlzc3Vlc1swXVxuICAgICAgICAgIG1lc3NhZ2UgPSB6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfY29tcG9uZW50czogc3RyaW5nW10gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICBtZXNzYWdlX2NvbXBvbmVudHMucHVzaCh6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBgJHtlcnJvci5pc3N1ZXMubGVuZ3RofSBJbnB1dCBFcnJvcnM6IGAgK1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLmpvaW4oXCIsIFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdmFsaWRhdGlvbl9lcnJvcnM6IGVycm9yLmZvcm1hdCgpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICBtZXNzYWdlOiBcIkVycm9yIHdoaWxlIHBhcnNpbmcgaW5wdXRcIixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSByZXMuanNvbiBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgaWYgKGlucHV0LnNob3VsZFZhbGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICB2YWxpZGF0ZUpzb25SZXNwb25zZShpbnB1dC5qc29uUmVzcG9uc2UsIHJlcylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChyZXEsIHJlcylcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoVmFsaWRhdGlvblxuIiwgImltcG9ydCB7IE5leHRBcGlSZXNwb25zZSwgTmV4dEFwaVJlcXVlc3QgfSBmcm9tIFwibmV4dFwiXG5pbXBvcnQgeyBNaWRkbGV3YXJlIGFzIFdyYXBwZXJNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL3dyYXBwZXJzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IEhUVFBNZXRob2RzIH0gZnJvbSBcIi4uL3dpdGgtcm91dGUtc3BlYy9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHNcIlxuaW1wb3J0IHtcbiAgU2VjdXJpdHlTY2hlbWVPYmplY3QsXG4gIFNlY3VyaXR5UmVxdWlyZW1lbnRPYmplY3QsXG59IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmU8VCwgRGVwID0ge30+ID0gV3JhcHBlck1pZGRsZXdhcmU8VCwgRGVwPiAmIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHNldHVwUGFyYW1zXG4gICAqL1xuICBzZWN1cml0eVNjaGVtYT86IFNlY3VyaXR5U2NoZW1lT2JqZWN0XG4gIHNlY3VyaXR5T2JqZWN0cz86IFNlY3VyaXR5UmVxdWlyZW1lbnRPYmplY3RbXVxufVxuXG50eXBlIFBhcmFtRGVmID0gei5ab2RUeXBlQW55IHwgei5ab2RFZmZlY3RzPHouWm9kVHlwZUFueT5cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVNwZWM8XG4gIEF1dGggZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIE1ldGhvZHMgZXh0ZW5kcyBIVFRQTWV0aG9kc1tdID0gYW55LFxuICBKc29uQm9keSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBRdWVyeVBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgTWlkZGxld2FyZXMgZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdID0gYW55W10sXG4gIEpzb25SZXNwb25zZSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55XG4+IHtcbiAgbWV0aG9kczogTWV0aG9kc1xuICBhdXRoOiBBdXRoXG4gIGpzb25Cb2R5PzogSnNvbkJvZHlcbiAgcXVlcnlQYXJhbXM/OiBRdWVyeVBhcmFtc1xuICBjb21tb25QYXJhbXM/OiBDb21tb25QYXJhbXNcbiAgbWlkZGxld2FyZXM/OiBNaWRkbGV3YXJlc1xuICBqc29uUmVzcG9uc2U/OiBKc29uUmVzcG9uc2VcbiAgZm9ybURhdGE/OiBGb3JtRGF0YVxufVxuXG5leHBvcnQgdHlwZSBNaWRkbGV3YXJlQ2hhaW5PdXRwdXQ8XG4gIE1XQ2hhaW4gZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdXG4+ID0gTVdDaGFpbiBleHRlbmRzIHJlYWRvbmx5IFtdXG4gID8ge31cbiAgOiBNV0NoYWluIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIEZpcnN0LCAuLi5pbmZlciBSZXN0XVxuICA/IEZpcnN0IGV4dGVuZHMgTWlkZGxld2FyZTxpbmZlciBULCBhbnk+XG4gICAgPyBUICZcbiAgICAgICAgKFJlc3QgZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdXG4gICAgICAgICAgPyBNaWRkbGV3YXJlQ2hhaW5PdXRwdXQ8UmVzdD5cbiAgICAgICAgICA6IG5ldmVyKVxuICAgIDogbmV2ZXJcbiAgOiBuZXZlclxuXG5leHBvcnQgdHlwZSBBdXRoTWlkZGxld2FyZXMgPSB7XG4gIFthdXRoX3R5cGU6IHN0cmluZ106IE1pZGRsZXdhcmU8YW55LCBhbnk+XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5QXJyYXlGb3JtYXQgPSBcImJyYWNrZXRzXCIgfCBcImNvbW1hXCIgfCBcInJlcGVhdFwiXG5cbmV4cG9ydCB0eXBlIFF1ZXJ5QXJyYXlGb3JtYXRzID0gcmVhZG9ubHkgUXVlcnlBcnJheUZvcm1hdFtdXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dXBQYXJhbXM8XG4gIEF1dGhNVyBleHRlbmRzIEF1dGhNaWRkbGV3YXJlcyA9IEF1dGhNaWRkbGV3YXJlcyxcbiAgR2xvYmFsTVcgZXh0ZW5kcyBNaWRkbGV3YXJlPGFueSwgYW55PltdID0gYW55W11cbj4ge1xuICBhdXRoTWlkZGxld2FyZU1hcDogQXV0aE1XXG4gIGdsb2JhbE1pZGRsZXdhcmVzOiBHbG9iYWxNV1xuICBleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmU/OiAoKG5leHQ6IEZ1bmN0aW9uKSA9PiBGdW5jdGlvbikgfCBudWxsXG5cbiAgLy8gVGhlc2UgaW1wcm92ZSBPcGVuQVBJIGdlbmVyYXRpb25cbiAgYXBpTmFtZTogc3RyaW5nXG4gIHByb2R1Y3Rpb25TZXJ2ZXJVcmw6IHN0cmluZ1xuXG4gIGFkZE9rU3RhdHVzPzogYm9vbGVhblxuXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxuICBzZWN1cml0eVNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCBTZWN1cml0eVNjaGVtZU9iamVjdD5cbiAgZ2xvYmFsU2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZUFueT5cblxuICBzdXBwb3J0ZWRBcnJheUZvcm1hdHM/OiBRdWVyeUFycmF5Rm9ybWF0c1xufVxuXG5jb25zdCBkZWZhdWx0TWlkZGxld2FyZU1hcCA9IHtcbiAgbm9uZTogKG5leHQpID0+IG5leHQsXG59IGFzIGNvbnN0XG5cbnR5cGUgU2VuZDxUPiA9IChib2R5OiBUKSA9PiB2b2lkXG50eXBlIE5leHRBcGlSZXNwb25zZVdpdGhvdXRKc29uQW5kU3RhdHVzTWV0aG9kcyA9IE9taXQ8XG4gIE5leHRBcGlSZXNwb25zZSxcbiAgXCJqc29uXCIgfCBcInN0YXR1c1wiXG4+XG5cbnR5cGUgU3VjY2Vzc2Z1bE5leHRBcGlSZXNwb25zZU1ldGhvZHM8VD4gPSB7XG4gIHN0YXR1czogKFxuICAgIHN0YXR1c0NvZGU6IDIwMCB8IDIwMVxuICApID0+IE5leHRBcGlSZXNwb25zZVdpdGhvdXRKc29uQW5kU3RhdHVzTWV0aG9kcyAmIHtcbiAgICBqc29uOiBTZW5kPFQ+XG4gIH1cbiAganNvbjogU2VuZDxUPlxufVxuXG50eXBlIEVycm9yTmV4dEFwaVJlc3BvbnNlTWV0aG9kcyA9IHtcbiAgc3RhdHVzOiAoc3RhdHVzQ29kZTogbnVtYmVyKSA9PiBOZXh0QXBpUmVzcG9uc2VXaXRob3V0SnNvbkFuZFN0YXR1c01ldGhvZHMgJiB7XG4gICAganNvbjogU2VuZDxhbnk+XG4gIH1cbiAganNvbjogU2VuZDxhbnk+XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlRnVuY3Rpb248XG4gIFNQIGV4dGVuZHMgU2V0dXBQYXJhbXM8QXV0aE1pZGRsZXdhcmVzPixcbiAgUlMgZXh0ZW5kcyBSb3V0ZVNwZWNcbj4gPSAoXG4gIHJlcTogKFNQW1wiYXV0aE1pZGRsZXdhcmVNYXBcIl0gJlxuICAgIHR5cGVvZiBkZWZhdWx0TWlkZGxld2FyZU1hcClbUlNbXCJhdXRoXCJdXSBleHRlbmRzIE1pZGRsZXdhcmU8XG4gICAgaW5mZXIgQXV0aE1XT3V0LFxuICAgIGFueVxuICA+XG4gICAgPyBPbWl0PE5leHRBcGlSZXF1ZXN0LCBcInF1ZXJ5XCIgfCBcImJvZHlcIj4gJlxuICAgICAgICBBdXRoTVdPdXQgJlxuICAgICAgICBNaWRkbGV3YXJlQ2hhaW5PdXRwdXQ8XG4gICAgICAgICAgUlNbXCJtaWRkbGV3YXJlc1wiXSBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmU8YW55LCBhbnk+W11cbiAgICAgICAgICAgID8gWy4uLlNQW1wiZ2xvYmFsTWlkZGxld2FyZXNcIl0sIC4uLlJTW1wibWlkZGxld2FyZXNcIl1dXG4gICAgICAgICAgICA6IFNQW1wiZ2xvYmFsTWlkZGxld2FyZXNcIl1cbiAgICAgICAgPiAmIHtcbiAgICAgICAgICBib2R5OiBSU1tcImZvcm1EYXRhXCJdIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gICAgICAgICAgICA/IHouaW5mZXI8UlNbXCJmb3JtRGF0YVwiXT5cbiAgICAgICAgICAgIDogUlNbXCJqc29uQm9keVwiXSBleHRlbmRzIHouWm9kVHlwZUFueVxuICAgICAgICAgICAgPyB6LmluZmVyPFJTW1wianNvbkJvZHlcIl0+XG4gICAgICAgICAgICA6IHt9XG4gICAgICAgICAgcXVlcnk6IFJTW1wicXVlcnlQYXJhbXNcIl0gZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgICAgICAgICAgID8gei5pbmZlcjxSU1tcInF1ZXJ5UGFyYW1zXCJdPlxuICAgICAgICAgICAgOiB7fVxuICAgICAgICAgIGNvbW1vblBhcmFtczogUlNbXCJjb21tb25QYXJhbXNcIl0gZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgICAgICAgICAgID8gei5pbmZlcjxSU1tcImNvbW1vblBhcmFtc1wiXT5cbiAgICAgICAgICAgIDoge31cbiAgICAgICAgfVxuICAgIDogYHVua25vd24gYXV0aCB0eXBlOiAke1JTW1wiYXV0aFwiXX0uIFlvdSBzaG91bGQgY29uZmlndXJlIHRoaXMgYXV0aCB0eXBlIGluIHlvdXIgYXV0aF9taWRkbGV3YXJlcyB3LyBjcmVhdGVXaXRoUm91dGVTcGVjLCBvciBtYXliZSB5b3UgbmVlZCB0byBhZGQgXCJhcyBjb25zdFwiIHRvIHlvdXIgcm91dGUgc3BlYyBkZWZpbml0aW9uLmAsXG4gIHJlczogTmV4dEFwaVJlc3BvbnNlV2l0aG91dEpzb25BbmRTdGF0dXNNZXRob2RzICZcbiAgICBTdWNjZXNzZnVsTmV4dEFwaVJlc3BvbnNlTWV0aG9kczxcbiAgICAgIFJTW1wianNvblJlc3BvbnNlXCJdIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gICAgICAgID8gei5pbmZlcjxSU1tcImpzb25SZXNwb25zZVwiXT5cbiAgICAgICAgOiBhbnlcbiAgICA+ICZcbiAgICBFcnJvck5leHRBcGlSZXNwb25zZU1ldGhvZHNcbikgPT4gUHJvbWlzZTx2b2lkPlxuXG5leHBvcnQgdHlwZSBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24gPSA8XG4gIFNQIGV4dGVuZHMgU2V0dXBQYXJhbXM8QXV0aE1pZGRsZXdhcmVzLCBhbnk+XG4+KFxuICBzZXR1cFBhcmFtczogU1BcbikgPT4gPFxuICBSUyBleHRlbmRzIFJvdXRlU3BlYzxcbiAgICBzdHJpbmcsXG4gICAgYW55LFxuICAgIGFueSxcbiAgICBhbnksXG4gICAgYW55LFxuICAgIGFueSxcbiAgICB6LlpvZE9iamVjdDxhbnksIGFueSwgYW55LCBhbnksIGFueT4sXG4gICAgYW55XG4gID5cbj4oXG4gIHJvdXRlX3NwZWM6IFJTXG4pID0+IChuZXh0OiBSb3V0ZUZ1bmN0aW9uPFNQLCBSUz4pID0+IGFueVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0FDQUE7OztBQ0FBO0FBaVVPLElBQU0sV0FBcUIsSUFBSSxpQkFBd0I7QUFDNUQsUUFBTSxrQkFBa0IsYUFBYSxhQUFhLFNBQVM7QUFDM0QsUUFBTSxNQUFNLGFBQWEsTUFBTSxHQUFHLEVBQUU7QUFFcEMsTUFBSSxzQkFBc0I7QUFDMUIsV0FBUyxJQUFJLElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQ3hDLDBCQUF1QixJQUFJLEdBQVcsbUJBQW1CO0FBQUEsRUFDM0Q7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxJQUFPLG1CQUFROzs7QUM3VWY7QUFXTyxJQUFNLGNBQWMsQ0FBQyxZQUEyQixDQUFDLFNBQVMsQ0FB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
|