sonamu 0.9.5 → 0.9.7
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/api/config.d.ts +13 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/context.d.ts +17 -7
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +18 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +55 -4
- package/dist/api/index.js +8 -3
- package/dist/api/sonamu.d.ts +24 -9
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +365 -79
- package/dist/api/websocket-helpers.d.ts +24 -0
- package/dist/api/websocket-helpers.d.ts.map +1 -0
- package/dist/api/websocket-helpers.js +77 -0
- package/dist/bin/cli.js +12 -4
- package/dist/dict/sonamu-dictionary.js +5 -5
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.js +3 -3
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/migration/code-generation.js +7 -7
- package/dist/stream/index.d.ts +6 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +13 -2
- package/dist/stream/ws-audience-resolver.d.ts +15 -0
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
- package/dist/stream/ws-audience-resolver.js +31 -0
- package/dist/stream/ws-audience.d.ts +28 -0
- package/dist/stream/ws-audience.d.ts.map +1 -0
- package/dist/stream/ws-audience.js +46 -0
- package/dist/stream/ws-cluster-bus.d.ts +23 -0
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
- package/dist/stream/ws-cluster-bus.js +18 -0
- package/dist/stream/ws-core.d.ts +15 -0
- package/dist/stream/ws-core.d.ts.map +1 -0
- package/dist/stream/ws-core.js +1 -0
- package/dist/stream/ws-delivery.d.ts +24 -0
- package/dist/stream/ws-delivery.d.ts.map +1 -0
- package/dist/stream/ws-delivery.js +103 -0
- package/dist/stream/ws-local-connection-store.d.ts +10 -0
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
- package/dist/stream/ws-local-connection-store.js +44 -0
- package/dist/stream/ws-presence-store.d.ts +61 -0
- package/dist/stream/ws-presence-store.d.ts.map +1 -0
- package/dist/stream/ws-presence-store.js +236 -0
- package/dist/stream/ws-registry.d.ts +42 -0
- package/dist/stream/ws-registry.d.ts.map +1 -0
- package/dist/stream/ws-registry.js +108 -0
- package/dist/stream/ws.d.ts +52 -0
- package/dist/stream/ws.d.ts.map +1 -0
- package/dist/stream/ws.js +397 -0
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +72 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +13 -12
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +7 -4
- package/dist/syncer/event-batcher.d.ts +27 -0
- package/dist/syncer/event-batcher.d.ts.map +1 -0
- package/dist/syncer/event-batcher.js +69 -0
- package/dist/syncer/file-patterns.d.ts +48 -26
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +71 -23
- package/dist/syncer/file-tracking.d.ts +13 -0
- package/dist/syncer/file-tracking.d.ts.map +1 -0
- package/dist/syncer/file-tracking.js +33 -0
- package/dist/syncer/index.js +2 -2
- package/dist/syncer/module-loader.d.ts +2 -11
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +3 -3
- package/dist/syncer/syncer-actions.d.ts +39 -6
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +125 -10
- package/dist/syncer/syncer.d.ts +33 -19
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +168 -168
- package/dist/syncer/watcher.d.ts +8 -0
- package/dist/syncer/watcher.d.ts.map +1 -0
- package/dist/syncer/watcher.js +105 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +2 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +36 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +8 -1
- package/dist/testing/fixture-manager.js +1 -1
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -2
- package/dist/ui/api.js +1 -1
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-DzZ7vBk4.js → index-BmThfg-s.js} +37 -37
- package/dist/ui-web/index.html +1 -1
- package/dist/utils/async-utils.d.ts +27 -3
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +56 -6
- package/dist/utils/formatter.d.ts +7 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +93 -59
- package/dist/utils/fs-utils.d.ts +2 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +10 -2
- package/dist/utils/process-utils.d.ts +10 -4
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +20 -7
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -2
- package/package.json +3 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
- package/src/api/__tests__/websocket-context.types.test.ts +58 -0
- package/src/api/config.ts +28 -2
- package/src/api/context.ts +21 -7
- package/src/api/decorators.ts +103 -3
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/dict/sonamu-dictionary.ts +2 -2
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +5 -5
- package/src/shared/app.shared.ts.txt +254 -1
- package/src/shared/web.shared.ts.txt +282 -1
- package/src/stream/__tests__/ws-contracts.test.ts +381 -0
- package/src/stream/__tests__/ws.test.ts +449 -0
- package/src/stream/index.ts +6 -0
- package/src/stream/ws-audience-resolver.ts +35 -0
- package/src/stream/ws-audience.ts +62 -0
- package/src/stream/ws-cluster-bus.ts +32 -0
- package/src/stream/ws-core.ts +16 -0
- package/src/stream/ws-delivery.ts +138 -0
- package/src/stream/ws-local-connection-store.ts +44 -0
- package/src/stream/ws-presence-store.ts +326 -0
- package/src/stream/ws-registry.ts +138 -0
- package/src/stream/ws.ts +591 -0
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
- package/src/syncer/api-parser.ts +112 -1
- package/src/syncer/checksum.ts +23 -29
- package/src/syncer/code-generator.ts +4 -1
- package/src/syncer/event-batcher.ts +72 -0
- package/src/syncer/file-patterns.ts +98 -30
- package/src/syncer/file-tracking.ts +27 -0
- package/src/syncer/module-loader.ts +5 -12
- package/src/syncer/syncer-actions.ts +179 -17
- package/src/syncer/syncer.ts +250 -287
- package/src/syncer/watcher.ts +128 -0
- package/src/tasks/workflow-manager.ts +1 -0
- package/src/template/__tests__/services.template.websocket.test.ts +79 -0
- package/src/template/implementations/services.template.ts +69 -0
- package/src/testing/bootstrap.ts +8 -1
- package/src/types/types.ts +20 -2
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +111 -74
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +21 -4
- package/src/utils/utils.ts +1 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Server } from "http";
|
|
2
|
+
import { type WebsocketPluginOptions } from "@fastify/websocket";
|
|
3
|
+
import { type FastifyReply } from "fastify";
|
|
4
|
+
import { type ExtendedApi } from "./decorators";
|
|
5
|
+
export declare function resolveIntegratedViteHmrOptions({ httpServer, requiresDedicatedWebSocketServer, rawPort, }: {
|
|
6
|
+
httpServer: Server;
|
|
7
|
+
requiresDedicatedWebSocketServer: boolean;
|
|
8
|
+
rawPort?: string | undefined;
|
|
9
|
+
}): {
|
|
10
|
+
server: Server;
|
|
11
|
+
} | {
|
|
12
|
+
port: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveWebSocketPluginOptions({ rawPluginOption, apis, }: {
|
|
15
|
+
rawPluginOption: boolean | WebsocketPluginOptions | undefined;
|
|
16
|
+
apis: ExtendedApi[];
|
|
17
|
+
}): WebsocketPluginOptions | undefined;
|
|
18
|
+
export declare function resolveWebSocketCloseDescriptor(error: unknown): {
|
|
19
|
+
code: number;
|
|
20
|
+
reason: string;
|
|
21
|
+
logLevel: "warn" | "error";
|
|
22
|
+
};
|
|
23
|
+
export declare function createWebSocketReplyStub(): FastifyReply;
|
|
24
|
+
//# sourceMappingURL=websocket-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-helpers.d.ts","sourceRoot":"","sources":["../../src/api/websocket-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAgB,+BAA+B,CAAC,EAC9C,UAAU,EACV,gCAAgC,EAChC,OAA0C,GAC3C,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC,EAAE,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAOxC;AAID,wBAAgB,6BAA6B,CAAC,EAC5C,eAAe,EACf,IAAI,GACL,EAAE;IACD,eAAe,EAAE,OAAO,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC9D,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB,GAAG,sBAAsB,GAAG,SAAS,CA6BrC;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CAgCA;AAID,wBAAgB,wBAAwB,IAAI,YAAY,CAQvD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { init_so_exceptions, isSoException } from "../exceptions/so-exceptions.js";
|
|
3
|
+
import { init_utils, isPlainObject } from "../utils/utils.js";
|
|
4
|
+
|
|
5
|
+
//#region src/api/websocket-helpers.ts
|
|
6
|
+
function resolveIntegratedViteHmrOptions({ httpServer, requiresDedicatedWebSocketServer, rawPort = process.env.SONAMU_VITE_HMR_PORT }) {
|
|
7
|
+
if (!requiresDedicatedWebSocketServer) {
|
|
8
|
+
return { server: httpServer };
|
|
9
|
+
}
|
|
10
|
+
const parsedPort = rawPort?.trim() ? Number(rawPort) : 24678;
|
|
11
|
+
return Number.isFinite(parsedPort) && parsedPort > 0 ? { port: parsedPort } : { port: 24678 };
|
|
12
|
+
}
|
|
13
|
+
function resolveWebSocketPluginOptions({ rawPluginOption, apis }) {
|
|
14
|
+
const pluginOptions = rawPluginOption && rawPluginOption !== true ? { ...rawPluginOption } : {};
|
|
15
|
+
const serverOptions = isPlainObject(pluginOptions.options) ? { ...pluginOptions.options } : {};
|
|
16
|
+
if (isPositiveNumber(pluginOptions.maxPayload) && serverOptions.maxPayload === undefined) {
|
|
17
|
+
serverOptions.maxPayload = pluginOptions.maxPayload;
|
|
18
|
+
delete pluginOptions.maxPayload;
|
|
19
|
+
}
|
|
20
|
+
if (serverOptions.maxPayload === undefined) {
|
|
21
|
+
const routeMaxPayloads = apis.map((api) => api.websocketOptions?.maxPayload).filter(isPositiveNumber);
|
|
22
|
+
if (routeMaxPayloads.length > 0) {
|
|
23
|
+
serverOptions.maxPayload = Math.max(...routeMaxPayloads);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (Object.keys(serverOptions).length > 0) {
|
|
27
|
+
pluginOptions.options = serverOptions;
|
|
28
|
+
}
|
|
29
|
+
return Object.keys(pluginOptions).length > 0 ? pluginOptions : undefined;
|
|
30
|
+
}
|
|
31
|
+
function resolveWebSocketCloseDescriptor(error) {
|
|
32
|
+
if (isSoException(error)) {
|
|
33
|
+
if (error.statusCode === 400) {
|
|
34
|
+
return {
|
|
35
|
+
code: 1008,
|
|
36
|
+
reason: "Invalid websocket handshake",
|
|
37
|
+
logLevel: "warn"
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
if (error.statusCode === 401 || error.statusCode === 403) {
|
|
41
|
+
return {
|
|
42
|
+
code: 1008,
|
|
43
|
+
reason: "Unauthorized websocket connection",
|
|
44
|
+
logLevel: "warn"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (error.statusCode >= 400 && error.statusCode < 500) {
|
|
48
|
+
return {
|
|
49
|
+
code: 1008,
|
|
50
|
+
reason: "Rejected websocket connection",
|
|
51
|
+
logLevel: "warn"
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
code: 1011,
|
|
57
|
+
reason: "WebSocket handler failed",
|
|
58
|
+
logLevel: "error"
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function createWebSocketReplyStub() {
|
|
62
|
+
return new Proxy({}, { get() {
|
|
63
|
+
throw new Error("FastifyReply is not available in websocket context. Define websocketContextProvider if your context setup depends on reply mutation.");
|
|
64
|
+
} });
|
|
65
|
+
}
|
|
66
|
+
function isPositiveNumber(value) {
|
|
67
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
68
|
+
}
|
|
69
|
+
var init_websocket_helpers = __esmMin((() => {
|
|
70
|
+
init_so_exceptions();
|
|
71
|
+
init_utils();
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
init_websocket_helpers();
|
|
76
|
+
export { createWebSocketReplyStub, init_websocket_helpers, resolveIntegratedViteHmrOptions, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
|
|
77
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWhlbHBlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS93ZWJzb2NrZXQtaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFNlcnZlciB9IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgV2Vic29ja2V0UGx1Z2luT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgaXNTb0V4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8vIEZhc3RpZnkgd2Vic29ja2V0IHJvdXRl7JmAIFZpdGUgSE1SIHdlYnNvY2tldOydtCDqsJnsnYAgc2VydmVyIHNvY2tldOydhCDrkZDqs6Ag7Lap64+M7ZWY64qUIOqyg+ydhCDrsKnsp4DtlZjquLAg7JyE7ZW0LFxuLy8gV1Mgcm91dGXqsIAg7KG07J6s7ZWY66m0IEhNUuydhCDrs4Trj4Qg7Y+s7Yq466GcIOu2hOumrO2VtCDrnYTsm4BcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zKHtcbiAgaHR0cFNlcnZlcixcbiAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXIsXG4gIHJhd1BvcnQgPSBwcm9jZXNzLmVudi5TT05BTVVfVklURV9ITVJfUE9SVCxcbn06IHtcbiAgaHR0cFNlcnZlcjogU2VydmVyO1xuICByZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcjogYm9vbGVhbjtcbiAgcmF3UG9ydD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB7IHNlcnZlcjogU2VydmVyIH0gfCB7IHBvcnQ6IG51bWJlciB9IHtcbiAgaWYgKCFyZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcikge1xuICAgIHJldHVybiB7IHNlcnZlcjogaHR0cFNlcnZlciB9O1xuICB9XG5cbiAgY29uc3QgcGFyc2VkUG9ydCA9IHJhd1BvcnQ/LnRyaW0oKSA/IE51bWJlcihyYXdQb3J0KSA6IDI0Njc4O1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZFBvcnQpICYmIHBhcnNlZFBvcnQgPiAwID8geyBwb3J0OiBwYXJzZWRQb3J0IH0gOiB7IHBvcnQ6IDI0Njc4IH07XG59XG5cbi8vIHJvdXRlLWxldmVsIG1heFBheWxvYWTrpbwg7ISc67KEIHBsdWdpbiBvcHRpb25z7Jy866GcIOyKueqyqeyLnOy8nCwg7YGwIGZyYW1l7J2EIOuwm+ydgCDrkqQg64ur64qUIOuMgOyLoFxuLy8gdHJhbnNwb3J0IOugiOuyqOyXkOyEnCDrqLzsoIAg7KCc7ZWc65CY64+E66GdIO2VqFxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgcmF3UGx1Z2luT3B0aW9uLFxuICBhcGlzLFxufToge1xuICByYXdQbHVnaW5PcHRpb246IGJvb2xlYW4gfCBXZWJzb2NrZXRQbHVnaW5PcHRpb25zIHwgdW5kZWZpbmVkO1xuICBhcGlzOiBFeHRlbmRlZEFwaVtdO1xufSk6IFdlYnNvY2tldFBsdWdpbk9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBjb25zdCBwbHVnaW5PcHRpb25zID1cbiAgICByYXdQbHVnaW5PcHRpb24gJiYgcmF3UGx1Z2luT3B0aW9uICE9PSB0cnVlXG4gICAgICA/IHsgLi4ucmF3UGx1Z2luT3B0aW9uIH1cbiAgICAgIDogKHt9IGFzIFdlYnNvY2tldFBsdWdpbk9wdGlvbnMgJiB7IG1heFBheWxvYWQ/OiBudW1iZXIgfSk7XG4gIGNvbnN0IHNlcnZlck9wdGlvbnMgPSBpc1BsYWluT2JqZWN0KHBsdWdpbk9wdGlvbnMub3B0aW9ucylcbiAgICA/IHsgLi4ucGx1Z2luT3B0aW9ucy5vcHRpb25zIH1cbiAgICA6ICh7fSBhcyBOb25OdWxsYWJsZTxXZWJzb2NrZXRQbHVnaW5PcHRpb25zW1wib3B0aW9uc1wiXT4pO1xuXG4gIGlmIChpc1Bvc2l0aXZlTnVtYmVyKHBsdWdpbk9wdGlvbnMubWF4UGF5bG9hZCkgJiYgc2VydmVyT3B0aW9ucy5tYXhQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICBzZXJ2ZXJPcHRpb25zLm1heFBheWxvYWQgPSBwbHVnaW5PcHRpb25zLm1heFBheWxvYWQ7XG4gICAgZGVsZXRlIHBsdWdpbk9wdGlvbnMubWF4UGF5bG9hZDtcbiAgfVxuXG4gIGlmIChzZXJ2ZXJPcHRpb25zLm1heFBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJvdXRlTWF4UGF5bG9hZHMgPSBhcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zPy5tYXhQYXlsb2FkKVxuICAgICAgLmZpbHRlcihpc1Bvc2l0aXZlTnVtYmVyKTtcblxuICAgIGlmIChyb3V0ZU1heFBheWxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcnZlck9wdGlvbnMubWF4UGF5bG9hZCA9IE1hdGgubWF4KC4uLnJvdXRlTWF4UGF5bG9hZHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhzZXJ2ZXJPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgcGx1Z2luT3B0aW9ucy5vcHRpb25zID0gc2VydmVyT3B0aW9ucztcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhwbHVnaW5PcHRpb25zKS5sZW5ndGggPiAwID8gcGx1Z2luT3B0aW9ucyA6IHVuZGVmaW5lZDtcbn1cblxuLy8gaGFuZHNoYWtlL2F1dGgvdmFsaWRhdGlvbiDsi6TtjKjrpbwgZ2VuZXJpYyAxMDEx66GcIOutieqwnOyngCDslYrqs6AgMTAwOChwb2xpY3kgdmlvbGF0aW9uKeuhnCDrp6TtlZHtlbQsXG4vLyBjbG9zZSBjb2RlIHBvbGljeeulvCDtlZwg6rOz7JeQ7IScIOygleydmO2VqFxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3I6IHVua25vd24pOiB7XG4gIGNvZGU6IG51bWJlcjtcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGxvZ0xldmVsOiBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbn0ge1xuICBpZiAoaXNTb0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiAxMDA4LFxuICAgICAgICByZWFzb246IFwiSW52YWxpZCB3ZWJzb2NrZXQgaGFuZHNoYWtlXCIsXG4gICAgICAgIGxvZ0xldmVsOiBcIndhcm5cIixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09IDQwMSB8fCBlcnJvci5zdGF0dXNDb2RlID09PSA0MDMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IDEwMDgsXG4gICAgICAgIHJlYXNvbjogXCJVbmF1dGhvcml6ZWQgd2Vic29ja2V0IGNvbm5lY3Rpb25cIixcbiAgICAgICAgbG9nTGV2ZWw6IFwid2FyblwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA+PSA0MDAgJiYgZXJyb3Iuc3RhdHVzQ29kZSA8IDUwMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogMTAwOCxcbiAgICAgICAgcmVhc29uOiBcIlJlamVjdGVkIHdlYnNvY2tldCBjb25uZWN0aW9uXCIsXG4gICAgICAgIGxvZ0xldmVsOiBcIndhcm5cIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiAxMDExLFxuICAgIHJlYXNvbjogXCJXZWJTb2NrZXQgaGFuZGxlciBmYWlsZWRcIixcbiAgICBsb2dMZXZlbDogXCJlcnJvclwiLFxuICB9O1xufVxuXG4vLyBXUyDqsr3roZzsl5DshJzripQgcmVwbHnqsIAg7KG07J6s7ZWY7KeAIOyViuycvOuvgOuhnCDsoJHqt7wg7Iuc64+E66W8IOymieyLnCDsl5Drn6zroZwgc3VyZmFjZe2VtCB0cmFuc3BvcnQgbWlzdXNl66W8IOu5qOumrCDrk5zrn6zrg4Rcbi8vIFNTRS9yZXBseeyXkCDsnZjsobTtlZjripQgY29udGV4dFByb3ZpZGVy6rCAIOyeiOycvOuptCB3ZWJzb2NrZXRDb250ZXh0UHJvdmlkZXLrpbwg65Sw66GcIOygleydmO2VmOudvOuKlCDqsIDsnbTrk5wg7Jet7ZWg64+EIO2VqFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YigpOiBGYXN0aWZ5UmVwbHkge1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIEZhc3RpZnlSZXBseSwge1xuICAgIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYXN0aWZ5UmVwbHkgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiByZXBseSBtdXRhdGlvbi5cIixcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPiAwO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVdBLFNBQWdCLGdDQUFnQyxFQUM5QyxZQUNBLGtDQUNBLFVBQVUsUUFBUSxJQUFJLHdCQUtrQjtBQUN4QyxLQUFJLENBQUMsa0NBQWtDO0FBQ3JDLFNBQU8sRUFBRSxRQUFRLFlBQVk7O0NBRy9CLE1BQU0sYUFBYSxTQUFTLE1BQU0sR0FBRyxPQUFPLFFBQVEsR0FBRztBQUN2RCxRQUFPLE9BQU8sU0FBUyxXQUFXLElBQUksYUFBYSxJQUFJLEVBQUUsTUFBTSxZQUFZLEdBQUcsRUFBRSxNQUFNLE9BQU87O0FBSy9GLFNBQWdCLDhCQUE4QixFQUM1QyxpQkFDQSxRQUlxQztDQUNyQyxNQUFNLGdCQUNKLG1CQUFtQixvQkFBb0IsT0FDbkMsRUFBRSxHQUFHLGlCQUFpQixHQUNyQixFQUFFO0NBQ1QsTUFBTSxnQkFBZ0IsY0FBYyxjQUFjLFFBQVEsR0FDdEQsRUFBRSxHQUFHLGNBQWMsU0FBUyxHQUMzQixFQUFFO0FBRVAsS0FBSSxpQkFBaUIsY0FBYyxXQUFXLElBQUksY0FBYyxlQUFlLFdBQVc7QUFDeEYsZ0JBQWMsYUFBYSxjQUFjO0FBQ3pDLFNBQU8sY0FBYzs7QUFHdkIsS0FBSSxjQUFjLGVBQWUsV0FBVztFQUMxQyxNQUFNLG1CQUFtQixLQUN0QixLQUFLLFFBQVEsSUFBSSxrQkFBa0IsV0FBVyxDQUM5QyxPQUFPLGlCQUFpQjtBQUUzQixNQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFDL0IsaUJBQWMsYUFBYSxLQUFLLElBQUksR0FBRyxpQkFBaUI7OztBQUk1RCxLQUFJLE9BQU8sS0FBSyxjQUFjLENBQUMsU0FBUyxHQUFHO0FBQ3pDLGdCQUFjLFVBQVU7O0FBRzFCLFFBQU8sT0FBTyxLQUFLLGNBQWMsQ0FBQyxTQUFTLElBQUksZ0JBQWdCOztBQUtqRSxTQUFnQixnQ0FBZ0MsT0FJOUM7QUFDQSxLQUFJLGNBQWMsTUFBTSxFQUFFO0FBQ3hCLE1BQUksTUFBTSxlQUFlLEtBQUs7QUFDNUIsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOztBQUdILE1BQUksTUFBTSxlQUFlLE9BQU8sTUFBTSxlQUFlLEtBQUs7QUFDeEQsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOztBQUdILE1BQUksTUFBTSxjQUFjLE9BQU8sTUFBTSxhQUFhLEtBQUs7QUFDckQsVUFBTztJQUNMLE1BQU07SUFDTixRQUFRO0lBQ1IsVUFBVTtJQUNYOzs7QUFJTCxRQUFPO0VBQ0wsTUFBTTtFQUNOLFFBQVE7RUFDUixVQUFVO0VBQ1g7O0FBS0gsU0FBZ0IsMkJBQXlDO0FBQ3ZELFFBQU8sSUFBSSxNQUFNLEVBQUUsRUFBa0IsRUFDbkMsTUFBTTtBQUNKLFFBQU0sSUFBSSxNQUNSLHVJQUNEO0lBRUosQ0FBQzs7QUFHSixTQUFTLGlCQUFpQixPQUFpQztBQUN6RCxRQUFPLE9BQU8sVUFBVSxZQUFZLE9BQU8sU0FBUyxNQUFNLElBQUksUUFBUTs7O3FCQW5IWjthQUNiIn0=
|
package/dist/bin/cli.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { execWithLinePrefix, init_console_util, printBuildSummary, printTaskFailed, printTaskHeader, printTaskStart, printTaskSuccess } from "../utils/console-util.js";
|
|
1
2
|
import { exists, init_fs_utils } from "../utils/fs-utils.js";
|
|
2
3
|
import { findApiRootPath, findAppRootPath, init_utils } from "../utils/utils.js";
|
|
3
4
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
@@ -7,7 +8,6 @@ import { addCompanionsToEntities, generateBetterAuthEntities } from "../auth/aut
|
|
|
7
8
|
import { API_ARTIFACTS, WEB_ARTIFACTS } from "./build-config.js";
|
|
8
9
|
import { Migrator, init_migrator } from "../migration/migrator.js";
|
|
9
10
|
import { FixtureManager, init_fixture_manager } from "../testing/fixture-manager.js";
|
|
10
|
-
import { execWithLinePrefix, init_console_util, printBuildSummary, printTaskFailed, printTaskHeader, printTaskStart, printTaskSuccess } from "../utils/console-util.js";
|
|
11
11
|
import { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand } from "./fixture.js";
|
|
12
12
|
import { testCommand } from "./test-command.js";
|
|
13
13
|
import assert from "assert";
|
|
@@ -16,9 +16,9 @@ import { cp, mkdir, readFile, readdir, rm, symlink, writeFile } from "fs/promise
|
|
|
16
16
|
import path from "path";
|
|
17
17
|
import chalk from "chalk";
|
|
18
18
|
import os from "os";
|
|
19
|
-
import dotenv from "dotenv";
|
|
20
19
|
import { execSync, spawn } from "child_process";
|
|
21
20
|
import { createRequire } from "module";
|
|
21
|
+
import dotenv from "dotenv";
|
|
22
22
|
import process from "process";
|
|
23
23
|
import { tsicli } from "tsicli";
|
|
24
24
|
|
|
@@ -255,9 +255,17 @@ bootstrap().finally(async () => {
|
|
|
255
255
|
/**
|
|
256
256
|
* pnpm sync 하면 실행되는 함수입니다.
|
|
257
257
|
* 프로젝트를 싱크합니다.
|
|
258
|
+
*
|
|
259
|
+
* `--force` 옵션이 주어지면 lock을 무시하고 풀-싱크를 수행합니다.
|
|
260
|
+
* git post-merge hook이나 CI에서 매 pull 후 자동 실행할 수 있도록 노출.
|
|
258
261
|
*/
|
|
259
262
|
async function sync() {
|
|
260
|
-
|
|
263
|
+
const { flags } = parseCliOptions();
|
|
264
|
+
if (flags.has("force")) {
|
|
265
|
+
await Sonamu.syncer.forceSync();
|
|
266
|
+
} else {
|
|
267
|
+
await Sonamu.syncer.sync();
|
|
268
|
+
}
|
|
261
269
|
}
|
|
262
270
|
/**
|
|
263
271
|
* API 개발 서버를 실행하는 공통 로직입니다.
|
|
@@ -1172,4 +1180,4 @@ async function findWorkspaceRoot() {
|
|
|
1172
1180
|
|
|
1173
1181
|
//#endregion
|
|
1174
1182
|
export { };
|
|
1175
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsibWlncmF0b3I6IE1pZ3JhdG9yIiwib3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImZpbHRlcmVkQXJndjogc3RyaW5nW10iLCJzcGF3biIsIm9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0iLCJmaWxlTmFtZSIsIkVudGl0eU1hbmFnZXIiLCJlcnJvcnM6IHN0cmluZ1tdIiwiZW50aXR5IiwicGx1Z2luczogQmV0dGVyQXV0aFBsdWdpbklkW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2NsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcblxuZG90ZW52LmNvbmZpZygpO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcCwgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3ltbGluaywgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5cbmltcG9ydCBrbmV4IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgdHNpY2xpIH0gZnJvbSBcInRzaWNsaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMsIGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIH0gZnJvbSBcIi4uL2F1dGgvYXV0aC1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IGlzVmFsaWRQbHVnaW5JZCwgU1VQUE9SVEVEX1BMVUdJTl9JRFMgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBCZXR0ZXJBdXRoUGx1Z2luSWQgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE1pZ3JhdG9yIH0gZnJvbSBcIi4uL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGV4ZWNXaXRoTGluZVByZWZpeCxcbiAgcHJpbnRCdWlsZFN1bW1hcnksXG4gIHByaW50VGFza0ZhaWxlZCxcbiAgcHJpbnRUYXNrSGVhZGVyLFxuICBwcmludFRhc2tTdGFydCxcbiAgcHJpbnRUYXNrU3VjY2Vzcyxcbn0gZnJvbSBcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGgsIGZpbmRBcHBSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQVBJX0FSVElGQUNUUywgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsZEFydGlmYWN0IH0gZnJvbSBcIi4vYnVpbGQtY29uZmlnXCI7XG5pbXBvcnQgeyBmaXh0dXJlRXhwbG9yZUNvbW1hbmQsIGZpeHR1cmVGZXRjaENvbW1hbmQsIGZpeHR1cmVHZW5Db21tYW5kIH0gZnJvbSBcIi4vZml4dHVyZVwiO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tIFwiLi90ZXN0LWNvbW1hbmRcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIiwgXCJ0ZXN0XCJdLmluY2x1ZGVzKHByb2Nlc3MuYXJndlsyXSA/PyBcIlwiKTtcbiAgaWYgKCFub3RUb0luaXQpIHtcbiAgICBhd2FpdCBTb25hbXUuaW5pdChmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyB0c2ljbGnripQg7KCV7ZmV7ZWcIOuqheugueyWtCDrp6Tsua3rp4wg7KeA7JuQ7ZWY66+A66GcLCAtLeuhnCDsi5zsnpHtlZjripQg7Ji17IWY6rO8IOq3uCDqsJLsnYQg7ZWE7YSw66eB7ZWp64uI64ukLlxuICAgIC8vIOyYteyFmCDtjIzsi7HsnYAg6rCBIHJ1bm5lciDtlajsiJjsl5DshJwg7JuQ67O4IHByb2Nlc3MuYXJnduulvCDsgqzsmqntlZjsl6wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIFwiLS1cIihiYXJlIGRvdWJsZSBkYXNoKeuKlCBwYXNzdGhyb3VnaCDqtazrtoTsnpDsnbTrr4DroZwsIOq3uCDrkqTsnZgg66qo65OgIOyduOyekOuPhCDsoJzsmbjtlanri4jri6QuXG4gICAgY29uc3QgZmlsdGVyZWRBcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBza2lwTmV4dCA9IGZhbHNlO1xuICAgIGxldCBhZnRlckRvdWJsZURhc2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXJnID0gcHJvY2Vzcy5hcmd2W2ldO1xuICAgICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICAgIGFmdGVyRG91YmxlRGFzaCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFmdGVyRG91YmxlRGFzaCkgY29udGludWU7XG4gICAgICBpZiAoc2tpcE5leHQpIHtcbiAgICAgICAgc2tpcE5leHQgPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi53snYAg7J20IGFyZ+unjCDsiqTtgrVcbiAgICAgICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAtLW9wdGlvbiB2YWx1ZSDtmJXsi53snbjsp4Ag7ZmV7J24OiDri6TsnYwgYXJn6rCAIC0t66GcIOyLnOyeke2VmOyngCDslYrsnLzrqbQg6rCS7J20IOyeiOuKlCDqsoNcbiAgICAgICAgY29uc3QgbmV4dEFyZyA9IHByb2Nlc3MuYXJndltpICsgMV07XG4gICAgICAgIGlmIChuZXh0QXJnICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItLVwiKSAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNraXBOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKGFyZyk7XG4gICAgfVxuXG4gICAgLy8gYnVpbGQvZGV2IOuqheugueyWtOqwgCDshJzruIzsu6Trp6jrk5wg7JeG7J20IO2YuOy2nOuQoCDrlYwgXCJhbGxcIuydhCDquLDrs7jqsJLsnLzroZwg7LaU6rCA7ZWp64uI64ukLlxuICAgIC8vIOyYiDogYHNvbmFtdSBidWlsZGAg4oaSIGBzb25hbXUgYnVpbGQgYWxsYCwgYHNvbmFtdSBkZXZgIOKGkiBgc29uYW11IGRldiBhbGxgXG4gICAgY29uc3QgY21kID0gZmlsdGVyZWRBcmd2WzJdO1xuICAgIGlmICgoY21kID09PSBcImJ1aWxkXCIgfHwgY21kID09PSBcImRldlwiKSAmJiBmaWx0ZXJlZEFyZ3YubGVuZ3RoID09PSAzKSB7XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChcImFsbFwiKTtcbiAgICB9XG5cbiAgICAvLyB0ZXN0IOy7pOunqOuTnOuKlCDqsIDrs4Ag7J247J6QKO2MjOydvOuqhSwgLS1wYXR0ZXJuIOuTsSnrpbwg67Cb7Jy866+A66GcIHRzaWNsaeulvCDsmrDtmoztlanri4jri6QuXG4gICAgaWYgKGNtZCA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybiB0ZXN0Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInN0YXR1c1wiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2Zvcm1cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcImNvbmVcIiwgXCJnZW5cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInN5bmNcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcInN0YXJ0XCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJzeW5jXCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJjcmVhdGVcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1widGVzdFwiXSxcbiAgICAgICAgW1wiYXV0aFwiLCBcImdlbmVyYXRlXCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiYWRkLWNvbXBhbmlvbnNcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIG1pZ3JhdGVfZ2VuZXJhdGUsXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICAgIFwiYXV0aF9hZGQtY29tcGFuaW9uc1wiOiBhdXRoX2FkZF9jb21wYW5pb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgXCItLW9uLWtleT1jOmNsZWFyOkNsZWFyIHNjcmVlblwiLCAvLyBjIOuIhOultOuptCDthLDrr7jrhJAg7ZmU66m07J2EIOyngOybjOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhtci1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgICAuLi5vcHRpb25zPy5leHRyYUVudixcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgLyBwbnBtIGRldiBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjsl5Ag64yA7ZW0IEhNUiDsp4Dsm5DtlZjripQg6rCc67CcIOyEnOuyhOulvCDrnYTsm4zspI3ri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FsbCgpIHtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpO1xuICBjb25zb2xlLmxvZyhg8J+MsiBTb25hbXUgdiR7dmVyc2lvbn1cXG5gKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkg67mM65OcIOyEpOyglSDtjIzsnbwg6rK966Gc66W8IOqysOygle2VqeuLiOuLpC5cbiAqIO2UhOuhnOygne2KuCDro6jtirjsl5AgYHRzZG93bi5jb25maWcudHNg6rCAIOyeiOycvOuptCDqt7jqsoPsnYQsIOyXhuycvOuptCBzb25hbXUg6riw67O4IOyEpOygleydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidHNkb3duLmNvbmZpZy50c1wiKTtcblxuICB0cnkge1xuICAgIGlmIChhd2FpdCBleGlzdHMobG9jYWxDb25maWdQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgdHNkb3duLmNvbmZpZy50cyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgICByZXR1cm4gbG9jYWxDb25maWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgdHNkb3duIEFQSSBjb25maWcgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy50c1wiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgQVBJIGJ1aWxkIGNvbmZpZyBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogc29uYW11IGJ1aWxkIC8gc29uYW11IGJ1aWxkIGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJ1aWxkX2FwaSArIGJ1aWxkX3dlYuydmCDtlanshLHsnoXri4jri6QuIFdlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866m0IFdlYiDruYzrk5zrpbwg7Iqk7YK17ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZF9hbGwoKSB7XG4gIGF3YWl0IGJ1aWxkX2FwaSgpO1xuICBhd2FpdCBidWlsZF93ZWIoeyBza2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYXBpKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gYXdhaXQgcmVzb2x2ZUFwaUJ1aWxkQ29uZmlnUGF0aCgpO1xuXG4gIGNvbnN0IGFwaVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCB7IHZlcnNpb24gfSA9IHJlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIik7XG4gIGNvbnNvbGUubG9nKGDwn4yyIFNvbmFtdSB2JHt2ZXJzaW9ufVxcbmApO1xuXG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwiZGlzdC9pbmRleC5qc1wiO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhlbnRyeVBvaW50KSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7ZW50cnlQb2ludH0gbm90IGZvdW5kLiBQbGVhc2UgYnVpbGQgeW91ciBwcm9qZWN0IGZpcnN0LmApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiUnVuOiBwbnBtIHNvbmFtdSBidWlsZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwiY2hpbGRfcHJvY2Vzc1wiKTtcbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgW1wiLS1lbmFibGUtc291cmNlLW1hcHNcIiwgXCItclwiLCBcImRvdGVudi9jb25maWdcIiwgZW50cnlQb2ludF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0sXG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEZpeHR1cmVNYW5hZ2VyKCkge1xuICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfYXBwbHkodGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcbiAgYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKFwiYXBwbHlcIiwgdGFyZ2V0cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcnVuKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGNvbnN0IGxvY2FsSG9zdHMgPSBbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdO1xuICBjb25zdCB0YXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldENvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXQgYXMga2V5b2YgU29uYW11REJDb25maWddO1xuICAgIGNvbnN0IGhvc3QgPSAodGFyZ2V0Q29uZmlnPy5jb25uZWN0aW9uIGFzIHsgaG9zdD86IHN0cmluZyB9KT8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgIHJldHVybiBsb2NhbEhvc3RzLmluY2x1ZGVzKGhvc3QudG9Mb3dlckNhc2UoKSk7XG4gIH0pO1xuXG4gIC8vIOuhnOy7rCDrjbDsnbTthLDrsqDsnbTsiqTsl5Ag64yA7ZW07ISc66eMIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsl5DshJwg64+Z7J6RXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9nZW5lcmF0ZSgpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICBjb25zdCBoYXNTdGF0dXMwID0gY29ubnMuc29tZSgoY29ubikgPT4gY29ubi5zdGF0dXMgPT09IDApO1xuICBpZiAoIWhhc1N0YXR1czApIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrp4jsnbTqt7jroIjsnbTshZgg7YyM7J287J2EIOyDneyEse2VmOugpOuptCDquLDsobQg66eI7J206re466CI7J207IWY7J20IOy1nOyGjCDtlZjrgpjsnZggRELsl5Ag66qo65GQIOyggeyaqeuQmOyWtCDsnojslrTslbwg7ZWp64uI64ukLlwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgY29ubiBvZiBjb25ucykge1xuICAgICAgaWYgKGNvbm4ucGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICAke2Nvbm4ubmFtZX06IHBlbmRpbmcgJHtjb25uLnBlbmRpbmcubGVuZ3RofeqwnGApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgY291bnQgPSBhd2FpdCBtaWdyYXRvci5nZW5lcmF0ZVByZXBhcmVkQ29kZXMoKTtcbiAgaWYgKGNvdW50ID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAke2NvdW50feqwnOydmCDrp4jsnbTqt7jroIjsnbTshZgg7YyM7J287J20IOyDneyEseuQmOyXiOyKteuLiOuLpC5gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9zdGF0dXMoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgLy8gc3RhdHVzO1xuICBjb25zb2xlLmxvZyhzdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICBjb25zdCBsb2NhbENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgcmV0dXJuIHJlbW90ZUNvbm4uaG9zdCA9PT0gbG9jYWxDb25uLmhvc3QgJiYgcmVtb3RlQ29ubi5kYXRhYmFzZSA9PT0gbG9jYWxDb25uLmRhdGFiYXNlO1xuICAgICAgfSkoKSxcbiAgICB9LFxuICBdIGFzIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbmZpZzogS25leC5Db25maWc7XG4gICAgdG9Ta2lwPzogYm9vbGVhbjtcbiAgfVtdO1xuXG4gIC8vIDEuIOq4sOykgERCIOyKpO2CpOuniOulvCDrjaTtlIRcbiAgY29uc29sZS5sb2coXCJEVU1QLi4uXCIpO1xuICBjb25zdCBkdW1wRmlsZW5hbWUgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgY29uc3Qgc3JjQ29ubiA9IHNyY0NvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgY29uc3QgbWlncmF0aW9uc0R1bXAgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LW1pZ3JhdGlvbnMtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBleGVjU3luYyhcbiAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtZCAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0gPiAke2R1bXBGaWxlbmFtZX1gLFxuICApO1xuICBjb25zdCBfZGIgPSBrbmV4KHNyY0NvbmZpZyk7XG4gIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgX2RiLnJhdyhcbiAgICBcIlNFTEVDVCBDT1VOVCgqKSBhcyBjb3VudCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBBTkQgdGFibGVfbmFtZSA9ICdrbmV4X21pZ3JhdGlvbnMnXCIsXG4gICAgW3NyY0Nvbm4uZGF0YWJhc2VdLFxuICApO1xuICBpZiAobWlncmF0aW9ucy5jb3VudCA+IDApIHtcbiAgICBleGVjU3luYyhcbiAgICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSBrbmV4X21pZ3JhdGlvbnMga25leF9taWdyYXRpb25zX2xvY2sgPiAke21pZ3JhdGlvbnNEdW1wfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOuMgOyDgURCIOqwgeqwgeyXkCDrjIDtlZjsl6wg7KG07J6s7Jes67aAIO2ZleyduCDtm4Qg67aT6riwXG4gIGZvciAoY29uc3QgeyBsYWJlbCwgY29uZmlnLCB0b1NraXAgfSBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgY29ubiA9IGNvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIGlmICh0b1NraXAgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgJHtsYWJlbH06IFNraXBwZWQhYCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSBrbmV4KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uKChjb25maWcuY29ubmVjdGlvbiA/PyB7fSkgYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKSxcbiAgICAgICAgZGF0YWJhc2U6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgW1tyb3ddXSA9IGF3YWl0IGRiLnJhdyhgU0hPVyBEQVRBQkFTRVMgTElLRSBcIiR7Y29ubi5kYXRhYmFzZX1cImApO1xuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgJHtsYWJlbH06IERhdGFiYXNlIFwiJHtjb25uLmRhdGFiYXNlfVwiIEFscmVhZHkgZXhpc3RzYCkpO1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFNZTkMgdG8gJHtsYWJlbH0uLi5gKTtcbiAgICBjb25zdCBteXNxbENtZCA9IGBteXNxbCAtaCR7Y29ubi5ob3N0fSAtdSR7Y29ubi51c2VyfSAtcCR7Y29ubi5wYXNzd29yZH1gO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0NSRUFURSBEQVRBQkFTRSBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHtkdW1wRmlsZW5hbWV9YCk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhtaWdyYXRpb25zRHVtcCkpIHtcbiAgICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHttaWdyYXRpb25zRHVtcH1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gIH1cblxuICBhd2FpdCBfZGIuZGVzdHJveSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2ltcG9ydChlbnRpdHlJZDogc3RyaW5nLCByZWNvcmRJZHM6IG51bWJlcltdKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbXBvcnRGaXh0dXJlKGVudGl0eUlkLCByZWNvcmRJZHMpO1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfc3luYygpIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZ2VuKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVHZW5Db21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2ZldGNoKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVGZXRjaENvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9leHBsb3JlKCkge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VPcHRpb25zKHByb2Nlc3MuYXJndik7XG4gIGF3YWl0IGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiDqsITri6jtlZwg7Ji17IWYIO2MjOyEnFxuICovXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMoXG4gIGFyZ3Y6IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiAmIHsgXzogc3RyaW5nW10gfSB7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0gPSB7IF86IFtdIH07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJndltpXTtcblxuICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMik7XG5cbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIGNvbnN0IFtrLCB2XSA9IGtleS5zcGxpdChcIj1cIik7XG4gICAgICAgIG9wdGlvbnNba10gPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IGFyZ3ZbaSArIDFdO1xuICAgICAgICBpZiAobmV4dCAmJiAhbmV4dC5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSBuZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcblxuICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgaSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5fLnB1c2goYXJnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9wcmFjdGljZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJhY3RpY2VEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInByYWN0aWNlc1wiKTtcbiAgY29uc3QgZmlsZU5hbWVzID0gYXdhaXQgcmVhZGRpcihwcmFjdGljZURpcik7XG5cbiAgY29uc3QgbWF4U2VxTm8gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhwcmFjdGljZURpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihwcmFjdGljZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRTZXFzID0gZmlsZU5hbWVzXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuc3RhcnRzV2l0aChcInBcIikgJiYgZmlsZU5hbWUuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBbLCBzZXFOb10gPSBmaWxlTmFtZS5tYXRjaCgvXnAoWzAtOV0rKS0vKSA/PyBbXCIwXCIsIFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHNlcU5vKTtcbiAgICAgIH0pXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuCDrmJDripQg6riA66Gc67KMIH4vLmNsYXVkZS/roZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIC0tZ2xvYmFsIO2UjOuemOq3uDogfi8uY2xhdWRlL+yXkCDrj5nquLDtmZQgKO2UhOuhnOygne2KuCDsg53shLEg7KCEIOyCrOyaqSDqsIDriqUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgaXNHbG9iYWwgPSBmbGFncy5oYXMoXCJnbG9iYWxcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGNvbnN0IGhvbWVDbGF1ZGVEaXIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBcIi5jbGF1ZGVcIik7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8oaG9tZUNsYXVkZURpciwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogZmFsc2UsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogZmFsc2UsXG4gICAgICBpc0dsb2JhbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIH4vLmNsYXVkZS9jb21tYW5kcy9zb25hbXUtc2tpbGxzLm1kIOyEpOy5mFxuICAgIGNvbnN0IHNvdXJjZUNvbW1hbmRzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwiY29tbWFuZHNcIik7XG4gICAgY29uc3Qgc291cmNlQ29tbWFuZCA9IHBhdGguam9pbihzb3VyY2VDb21tYW5kc0RpciwgXCJzb25hbXUtc2tpbGxzLm1kXCIpO1xuICAgIGlmIChhd2FpdCBleGlzdHMoc291cmNlQ29tbWFuZCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldENvbW1hbmRzRGlyID0gcGF0aC5qb2luKGhvbWVDbGF1ZGVEaXIsIFwiY29tbWFuZHNcIik7XG4gICAgICBhd2FpdCBta2Rpcih0YXJnZXRDb21tYW5kc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBjcChzb3VyY2VDb21tYW5kLCBwYXRoLmpvaW4odGFyZ2V0Q29tbWFuZHNEaXIsIFwic29uYW11LXNraWxscy5tZFwiKSk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIC9zb25hbXUtc2tpbGxzIGNvbW1hbmQgaW5zdGFsbGVkIOKGkiB+Ly5jbGF1ZGUvY29tbWFuZHMvYCkpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbiAgR2xvYmFsIHN5bmMgY29tcGxldGUg4oaSIH4vLmNsYXVkZS9za2lsbHMvc29uYW11L2ApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgVGhlc2Ugc2tpbGxzIGFyZSBhdmFpbGFibGUgaW4gYWxsIENsYXVkZSBDb2RlIHNlc3Npb25zLmApKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbShcbiAgICAgICAgYCAgT25jZSBhIHByb2plY3QgaXMgY3JlYXRlZCwgcnVuICdwbnBtIHNvbmFtdSBza2lsbHMgc3luYycgZm9yIHByb2plY3QtbG9jYWwgc3luYy5gLFxuICAgICAgKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICAgIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIik7XG4gICAgYXdhaXQgc2tpbGxzX3N5bmNfdG8oY2xhdWRlRGlyLCBzb3VyY2VTa2lsbHNEaXIsIHNvdXJjZUNsYXVkZU1kLCB7XG4gICAgICB1c2VTeW1saW5rOiB0cnVlLFxuICAgICAgY29weVByb2plY3RUZW1wbGF0ZXM6IHRydWUsXG4gICAgICBzb3VyY2VCYXNlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogY2xhdWRlRGly66GcIHNraWxsc+ulvCDrj5nquLDtmZTtlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX3N5bmNfdG8oXG4gIGNsYXVkZURpcjogc3RyaW5nLFxuICBzb3VyY2VTa2lsbHNEaXI6IHN0cmluZyxcbiAgc291cmNlQ2xhdWRlTWQ6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIHVzZVN5bWxpbms6IGJvb2xlYW47XG4gICAgY29weVByb2plY3RUZW1wbGF0ZXM6IGJvb2xlYW47XG4gICAgc291cmNlQmFzZT86IHN0cmluZztcbiAgICBpc0dsb2JhbD86IGJvb2xlYW47XG4gIH0sXG4pIHtcbiAgY29uc3QgdGFyZ2V0U2tpbGxzRGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJzb25hbXVcIik7XG5cbiAgLy8g6riw7KG0IOuUlOugie2GoOumrC9zeW1saW5rIOyCreygnCDtm4Qg7J6s7IOd7ISxXG4gIC8vIGV4aXN0cygp64qUIGJyb2tlbiBzeW1saW5r66W8IOqwkOyngO2VmOyngCDrqrvtlZjrr4DroZwgcm3snYQg66y07KGw6rG0IOyLnOuPhO2VqeuLiOuLpFxuICB0cnkge1xuICAgIGF3YWl0IHJtKHRhcmdldFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyDtjIzsnbzsnbQg7JeG7Jy866m0IOustOyLnFxuICB9XG5cbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldFNraWxsc0RpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGlmIChvcHRpb25zLnVzZVN5bWxpbmspIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3ltbGluayhzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0RpciwgXCJkaXJcIik7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFNraWxscyBsaW5rZWQgKHN5bWxpbmspYCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsueWVsbG93KGDimqAgU3ltbGluayBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApLFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICBGYWxsaW5nIGJhY2sgdG8gY29weS4uLmApKTtcbiAgICAgIGF3YWl0IHNraWxsc0NvcHkoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgfVxuXG4gIC8vIHByb2plY3Qg65SU66CJ7Yag66asIOy0iOq4sO2ZlCAo7JeG7Jy866m0IOyDneyEsSwg7J6I7Jy866m0IOycoOyngClcbiAgaWYgKG9wdGlvbnMuY29weVByb2plY3RUZW1wbGF0ZXMgJiYgb3B0aW9ucy5zb3VyY2VCYXNlKSB7XG4gICAgY29uc3Qgc291cmNlUHJvamVjdERpciA9IHBhdGguam9pbihvcHRpb25zLnNvdXJjZUJhc2UsIFwicHJvamVjdFwiKTtcbiAgICBjb25zdCB0YXJnZXRQcm9qZWN0RGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJwcm9qZWN0XCIpO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VQcm9qZWN0RGlyKSkge1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHRhcmdldFByb2plY3REaXIpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNwKHNvdXJjZVByb2plY3REaXIsIHRhcmdldFByb2plY3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgUHJvamVjdCB0ZW1wbGF0ZXMgaW5pdGlhbGl6ZWRgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICAgYOKclyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9qZWN0IHRlbXBsYXRlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGDij60gUHJvamVjdCB0ZW1wbGF0ZXMgYWxyZWFkeSBleGlzdCAocHJlc2VydmVkKWApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBzZXR0aW5ncy5sb2NhbC5qc29uIOKAlCBwcm9qZWN0LWxvY2FsIOuqqOuTnOyXkOyEnOunjCwg7JeG7J2EIOuVjOunjCDsg53shLFcbiAgaWYgKG9wdGlvbnMuY29weVByb2plY3RUZW1wbGF0ZXMpIHtcbiAgICBjb25zdCBzZXR0aW5nc0xvY2FsUGF0aCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2V0dGluZ3MubG9jYWwuanNvblwiKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc2V0dGluZ3NMb2NhbFBhdGgpKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NDb250ZW50ID0ge1xuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBQb3N0VG9vbFVzZTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcjogXCJFZGl0fFdyaXRlfE11bHRpRWRpdFwiLFxuICAgICAgICAgICAgICAgIGhvb2tzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBcInBucG0gY2hlY2sgMj4mMSB8IGhlYWQgLTYwXCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShzZXR0aW5nc0xvY2FsUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3NDb250ZW50LCBudWxsLCAyKX1cXG5gKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAuY2xhdWRlL3NldHRpbmdzLmxvY2FsLmpzb24gY3JlYXRlZGApKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYOKclyBGYWlsZWQgdG8gY3JlYXRlIHNldHRpbmdzLmxvY2FsLmpzb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGDij60gLmNsYXVkZS9zZXR0aW5ncy5sb2NhbC5qc29uIGFscmVhZHkgZXhpc3RzIChwcmVzZXJ2ZWQpYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENMQVVERS5tZCDrs7Xsgqwv7JeF642w7J207Yq4XG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlQ2xhdWRlTWQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldENsYXVkZU1kID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJDTEFVREUubWRcIik7XG4gICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc291cmNlQ2xhdWRlTWQsIFwidXRmLThcIik7XG4gICAgICAvLyDquIDroZzrsowg66qo65Oc7JeQ7ISc64qUIOyDgeuMgCDqsr3roZzrpbwg7KCI64yAIOqyveuhnOuhnCDrs4DtmZjtlanri4jri6RcbiAgICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBvcHRpb25zLmlzR2xvYmFsXG4gICAgICAgID8gcmF3Q29udGVudC5yZXBsYWNlQWxsKFwiLmNsYXVkZS9za2lsbHMvc29uYW11L1wiLCBcIn4vLmNsYXVkZS9za2lsbHMvc29uYW11L1wiKVxuICAgICAgICA6IHJhd0NvbnRlbnQ7XG5cbiAgICAgIGlmIChhd2FpdCBleGlzdHModGFyZ2V0Q2xhdWRlTWQpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0YXJnZXRDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOlNUQVJUIC0tPlwiO1xuICAgICAgICBjb25zdCBlbmRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOkVORCAtLT5cIjtcbiAgICAgICAgaWYgKHRhcmdldENvbnRlbnQuaW5jbHVkZXMoc3RhcnRNYXJrZXIpICYmIHRhcmdldENvbnRlbnQuaW5jbHVkZXMoZW5kTWFya2VyKSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKHN0YXJ0TWFya2VyKTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2YoZW5kTWFya2VyKTtcblxuICAgICAgICAgIGlmIChzdGFydElkeCAhPT0gLTEgJiYgZW5kSWR4ICE9PSAtMSAmJiBzdGFydElkeCA8IGVuZElkeCkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZyhlbmRJZHggKyBlbmRNYXJrZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtiZWZvcmV9JHtzdGFydE1hcmtlcn1cXG4ke3NvdXJjZUNvbnRlbnR9XFxuJHtlbmRNYXJrZXJ9JHthZnRlcn1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBuZXdDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKG1hcmtlciByZWdpb24pYCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKPrSBDTEFVREUubWQgbWFya2VyIHBvc2l0aW9ucyBpbnZhbGlkLCBza2lwcGVkYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDrp4jsu6TqsIAg7JeG64qUIOq4sOyhtCBDTEFVREUubWTsl5AgU29uYW11IOyEueyFmOydhCDstpTqsIDtlanri4jri6RcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IGAke3RhcmdldENvbnRlbnQudHJpbUVuZCgpfVxcblxcbjwhLS0gU09OQU1VOlNUQVJUIC0tPlxcbiR7c291cmNlQ29udGVudH1cXG48IS0tIFNPTkFNVTpFTkQgLS0+XFxuYDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIGFwcGVuZGVkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCB1cGRhdGVkIChhcHBlbmRlZCBTb25hbXUgc2VjdGlvbilgKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdpdGhNYXJrZXJzID0gYDwhLS0gU09OQU1VOlNUQVJUIC0tPlxcbiR7c291cmNlQ29udGVudH1cXG48IS0tIFNPTkFNVTpFTkQgLS0+XFxuYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCB3aXRoTWFya2Vycyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIGNyZWF0ZWRgKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBg4pyXIEZhaWxlZCB0byB1cGRhdGUgQ0xBVURFLm1kOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2tpbGxzQ29weShzcmM6IHN0cmluZywgZGVzdDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY3Aoc3JjLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFNraWxscyBjb3BpZWRgKSk7XG4gIH0gY2F0Y2ggKGNvcHlFcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIGDinJcgRmFpbGVkIHRvIGNvcHkgc2tpbGxzOiAke2NvcHlFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY29weUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoY29weUVycm9yKX1gLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRocm93IGNvcHlFcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBjcmVhdGUgPG5hbWU+IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog66Gc7LusIHNraWxsIOy0iOyViOydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19jcmVhdGUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBsb2NhbERpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIiwgXCJsb2NhbFwiKTtcblxuICAvLyA9PT0g7YyM7J2866qFIOqygOymnSDrsI8gU2FuaXRpemUgPT09XG4gIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIFNraWxsIG5hbWUgaXMgcmVxdWlyZWRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzYW5pdGl6ZWQgPSBuYW1lXG4gICAgLy8g6rO167Cx7J2EIO2VmOydtO2UiOycvOuhnFxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuICAgIC8vIOqyveuhnCDqtazrtoTsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1svXFxcXF0vZywgXCItXCIpXG4gICAgLy8gUGF0aCB0cmF2ZXJzYWwg67Cp7KeAXG4gICAgLnJlcGxhY2UoL1xcLlxcLi9nLCBcIlwiKVxuICAgIC8vIFdpbmRvd3Mg6riI7KeAIOusuOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWzw+OlwifD8qXS9nLCBcIlwiKVxuICAgIC8vIOyLnOyekS/rgZ0g7KCQLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCDsoJzqsbBcbiAgICAucmVwbGFjZSgvXlsuXFwtX10rfFsuXFwtX10rJC9nLCBcIlwiKVxuICAgIC8vIOyXsOyGjeuQnCDtlZjsnbTtlIjsnYQg7ZWY64KY66GcXG4gICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgIC8vIOyVjO2MjOuysywg7Iir7J6QLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCwg7ZWc6riA66eMIO2XiOyaqVxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOS1f6rCALe2eo10vZywgXCJcIik7XG5cbiAgLy8g6ri47J20IOygnO2VnFxuICBjb25zdCBNQVhfTEVOR1RIID0gMTAwO1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIE1BWF9MRU5HVEgpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgdHJ1bmNhdGVkIHRvICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2ApKTtcbiAgfVxuXG4gIC8vIFdpbmRvd3Mg7JiI7JW97Ja0IO2ZleyduFxuICBjb25zdCBSRVNFUlZFRF9OQU1FUyA9IFtcbiAgICBcIkNPTlwiLFxuICAgIFwiUFJOXCIsXG4gICAgXCJBVVhcIixcbiAgICBcIk5VTFwiLFxuICAgIFwiQ09NMVwiLFxuICAgIFwiQ09NMlwiLFxuICAgIFwiQ09NM1wiLFxuICAgIFwiQ09NNFwiLFxuICAgIFwiQ09NNVwiLFxuICAgIFwiQ09NNlwiLFxuICAgIFwiQ09NN1wiLFxuICAgIFwiQ09NOFwiLFxuICAgIFwiQ09NOVwiLFxuICAgIFwiTFBUMVwiLFxuICAgIFwiTFBUMlwiLFxuICAgIFwiTFBUM1wiLFxuICAgIFwiTFBUNFwiLFxuICAgIFwiTFBUNVwiLFxuICAgIFwiTFBUNlwiLFxuICAgIFwiTFBUN1wiLFxuICAgIFwiTFBUOFwiLFxuICAgIFwiTFBUOVwiLFxuICBdO1xuICBpZiAoUkVTRVJWRURfTkFNRVMuaW5jbHVkZXMoc2FuaXRpemVkLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgc2FuaXRpemVkID0gYHNraWxsLSR7c2FuaXRpemVkfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgUmVzZXJ2ZWQgbmFtZSBkZXRlY3RlZCwgcHJlZml4ZWQgd2l0aCBcInNraWxsLVwiYCkpO1xuICB9XG5cbiAgLy8g67mIIOusuOyekOyXtCDssrTtgaxcbiAgaWYgKHNhbml0aXplZCA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIEludmFsaWQgc2tpbGwgbmFtZSBhZnRlciBzYW5pdGl6YXRpb25cIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBPcmlnaW5hbDogXCIke25hbWV9XCJgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g67OA6rK9IOyVjOumvFxuICBpZiAoc2FuaXRpemVkICE9PSBuYW1lKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSBzYW5pdGl6ZWQ6IFwiJHtuYW1lfVwiIOKGkiBcIiR7c2FuaXRpemVkfVwiYCkpO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obG9jYWxEaXIsIGAke3Nhbml0aXplZH0ubWRgKTtcblxuICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgU2tpbGwgXCIke3Nhbml0aXplZH1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIobG9jYWxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC0tLVxubmFtZTogJHtzYW5pdGl6ZWR9XG5jYXRlZ29yeTogb3RoZXJcbmNyZWF0ZWRfYXQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX1cbnN0YXR1czogZHJhZnRcbi0tLVxuXG4jICR7c2FuaXRpemVkfVxuXG4jIyDsg4HtmalcblxuW+yWtOuWpCDrrLjsoJzsmIDripTsp4BdXG5cbiMjIO2VtOqysCDrsKnrspVcblxuW+yWtOuWu+qyjCDtlbTqsrDtlojripTsp4BdXG5cbiMjIOy9lOuTnCDsmIjsi5xcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuLy8g7JiI7IucIOy9lOuTnFxuXFxgXFxgXFxgXG5gO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgdGVtcGxhdGUpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvbG9jYWwvJHtzYW5pdGl6ZWR9Lm1kYCkpO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IGF1dGggZ2VuZXJhdGUg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBiZXR0ZXItYXV0aCDsl5Tti7Dti7Drk6QoVXNlciwgU2Vzc2lvbiwgQWNjb3VudCwgVmVyaWZpY2F0aW9uKeydhCDsg53shLHtlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLS1wbHVnaW5zIHBob25lLW51bWJlciwyZmEgIO2UjOufrOq3uOyduCDsl5Tti7Dti7Drj4Qg7ZWo6ruYIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2dlbmVyYXRlKCkge1xuICAvLyAtLXBsdWdpbnMg7Ji17IWYIO2MjOyLsVxuICBjb25zdCBwbHVnaW5zQXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoXCItLXBsdWdpbnNcIikpO1xuICBjb25zdCBwbHVnaW5zOiBCZXR0ZXJBdXRoUGx1Z2luSWRbXSA9IFtdO1xuXG4gIGlmIChwbHVnaW5zQXJnKSB7XG4gICAgY29uc3QgcGx1Z2luVmFsdWUgPSBwbHVnaW5zQXJnLmluY2x1ZGVzKFwiPVwiKVxuICAgICAgPyBwbHVnaW5zQXJnLnNwbGl0KFwiPVwiKVsxXVxuICAgICAgOiBwcm9jZXNzLmFyZ3ZbcHJvY2Vzcy5hcmd2LmluZGV4T2YocGx1Z2luc0FyZykgKyAxXTtcblxuICAgIGlmIChwbHVnaW5WYWx1ZSkge1xuICAgICAgY29uc3QgcGx1Z2luSWRzID0gcGx1Z2luVmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHBsdWdpbklkcykge1xuICAgICAgICBpZiAoaXNWYWxpZFBsdWdpbklkKGlkKSkge1xuICAgICAgICAgIHBsdWdpbnMucHVzaChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgVW5rbm93biBwbHVnaW46ICR7aWR9YCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBTdXBwb3J0ZWQgcGx1Z2luczogJHtTVVBQT1JURURfUExVR0lOX0lEUy5qb2luKFwiLCBcIil9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEdlbmVyYXRpbmcgYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGx1Z2luczogJHtwbHVnaW5zLmpvaW4oXCIsIFwiKX1gKSk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyh7IHBsdWdpbnMgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBhZGQtY29tcGFuaW9ucyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOq4sOyhtCDtlITroZzsoJ3tirjsnZggZW50aXR5Lmpzb27sl5AgZml4dHVyZUNvbXBhbmlvbnPrpbwg7IaM6riJIOy2lOqwgO2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrr7ggZml4dHVyZUNvbXBhbmlvbnPqsIAg7J6I64qUIGVudGl0eeuKlCDsiqTtgrXtlanri4jri6QgKOuNruyWtOyTsOq4sCDsl4bsnYwpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2FkZF9jb21wYW5pb25zKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgQWRkaW5nIGZpeHR1cmVDb21wYW5pb25zIHRvIGJldHRlci1hdXRoIGVudGl0aWVzLi4uXFxuXCIpKTtcbiAgYXdhaXQgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcbuKchSBEb25lIVwiKSk7XG59XG5cbi8qKlxuICog7JuM7YGs7Iqk7Y6Y7J207IqkIOujqO2KuOulvCDssL7sirXri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IHBucG0td29ya3NwYWNlLnlhbWwgPiBwYWNrYWdlLmpzb24od29ya3NwYWNlcykgPiAuYWdlbnRzL1xuICpcbiAqIENMQVVERS5tZOuKlCDshJzruIztjKjtgqTsp4Dsl5Drj4Qg7KG07J6s7ZWgIOyImCDsnojsnLzrr4DroZwg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAqIC5hZ2VudHMv64qUIGFnZW50cyBpbml07J20IOyDneyEse2VmOuKlCDrlJTroInthqDrpqzroZwsIOybjO2BrOyKpO2OmOydtOyKpCDro6jtirjsl5Drp4wg7KG07J6s7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdCgpIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgd2hpbGUgKGRpciAhPT0gcGF0aC5kaXJuYW1lKGRpcikpIHtcbiAgICAvLyAxLiBwbnBtLXdvcmtzcGFjZS55YW1sOiDtmZXsi6TtlZwgbW9ub3JlcG8g66Oo7Yq4LlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG5cbiAgICAvLyAyLiBwYWNrYWdlLmpzb27sl5Agd29ya3NwYWNlcyDtlYTrk5zqsIAg7J6I7Jy866m0IG1vbm9yZXBvIOujqO2KuC5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGlmIChhd2FpdCBleGlzdHMocGFja2FnZVBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGFja2FnZVBhdGgsIFwidXRmLThcIikpO1xuICAgICAgICBpZiAocGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICAgIHJldHVybiBkaXI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDtjIzsi7Eg7Iuk7Yyo7IucIOustOyLnFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIC5hZ2VudHMvOiBhZ2VudHMgaW5pdOydtCDsg53shLHtlZwg65SU66CJ7Yag66asLiDshJzruIztjKjtgqTsp4Dsl5DripQg7KG07J6s7ZWY7KeAIOyViuydjC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwiLmFnZW50c1wiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgZGlyID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyDssL7sp4Ag66q77ZWY66m0IGFwaSDtj7TrjZTsnZgg67aA66qoIOyCrOyaqVxuICByZXR1cm4gZmluZEFwcFJvb3RQYXRoKCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFpQnVDO3FCQUtrQjtlQUNSO3NCQUNXO21CQVE3QjtlQUNZO1lBQ3VCO0FBL0JsRSxPQUFPLFFBQVE7QUFxQ2YsSUFBSUE7Ozs7QUFLSixTQUFTLGdCQUFnQixPQUFpQixRQUFRLE1BR2hEO0NBQ0EsTUFBTSxRQUFRLElBQUksS0FBYTtDQUMvQixNQUFNQyxVQUFrQyxFQUFFO0FBRTFDLE1BQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztFQUNwQyxNQUFNLE1BQU0sS0FBSztBQUNqQixNQUFJLENBQUMsSUFBSSxXQUFXLEtBQUssQ0FBRTtBQUczQixNQUFJLElBQUksU0FBUyxJQUFJLEVBQUU7R0FDckIsTUFBTSxDQUFDLEtBQUssU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDLE1BQU0sSUFBSTtBQUM1QyxXQUFRLE9BQU87QUFDZjs7RUFJRixNQUFNLFVBQVUsS0FBSyxJQUFJO0FBQ3pCLE1BQUksV0FBVyxDQUFDLFFBQVEsV0FBVyxLQUFLLElBQUksQ0FBQyxRQUFRLFdBQVcsSUFBSSxFQUFFO0FBQ3BFLFdBQVEsSUFBSSxNQUFNLEVBQUUsSUFBSTtBQUN4QjtTQUNLO0FBRUwsU0FBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7OztBQUkzQixRQUFPO0VBQUU7RUFBTztFQUFTOztBQUczQixlQUFlLFlBQVk7Q0FDekIs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
|
|
1183
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwibmFtZXMiOlsibWlncmF0b3I6IE1pZ3JhdG9yIiwib3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImZpbHRlcmVkQXJndjogc3RyaW5nW10iLCJzcGF3biIsIm9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0iLCJmaWxlTmFtZSIsIkVudGl0eU1hbmFnZXIiLCJlcnJvcnM6IHN0cmluZ1tdIiwiZW50aXR5IiwicGx1Z2luczogQmV0dGVyQXV0aFBsdWdpbklkW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2NsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcblxuZG90ZW52LmNvbmZpZygpO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcCwgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3ltbGluaywgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5cbmltcG9ydCBrbmV4IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgdHNpY2xpIH0gZnJvbSBcInRzaWNsaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMsIGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIH0gZnJvbSBcIi4uL2F1dGgvYXV0aC1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IGlzVmFsaWRQbHVnaW5JZCwgU1VQUE9SVEVEX1BMVUdJTl9JRFMgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBCZXR0ZXJBdXRoUGx1Z2luSWQgfSBmcm9tIFwiLi4vYXV0aC9wbHVnaW5zL2VudGl0eS1kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE1pZ3JhdG9yIH0gZnJvbSBcIi4uL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGV4ZWNXaXRoTGluZVByZWZpeCxcbiAgcHJpbnRCdWlsZFN1bW1hcnksXG4gIHByaW50VGFza0ZhaWxlZCxcbiAgcHJpbnRUYXNrSGVhZGVyLFxuICBwcmludFRhc2tTdGFydCxcbiAgcHJpbnRUYXNrU3VjY2Vzcyxcbn0gZnJvbSBcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGgsIGZpbmRBcHBSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQVBJX0FSVElGQUNUUywgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsZEFydGlmYWN0IH0gZnJvbSBcIi4vYnVpbGQtY29uZmlnXCI7XG5pbXBvcnQgeyBmaXh0dXJlRXhwbG9yZUNvbW1hbmQsIGZpeHR1cmVGZXRjaENvbW1hbmQsIGZpeHR1cmVHZW5Db21tYW5kIH0gZnJvbSBcIi4vZml4dHVyZVwiO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tIFwiLi90ZXN0LWNvbW1hbmRcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIiwgXCJ0ZXN0XCJdLmluY2x1ZGVzKHByb2Nlc3MuYXJndlsyXSA/PyBcIlwiKTtcbiAgaWYgKCFub3RUb0luaXQpIHtcbiAgICBhd2FpdCBTb25hbXUuaW5pdChmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyB0c2ljbGnripQg7KCV7ZmV7ZWcIOuqheugueyWtCDrp6Tsua3rp4wg7KeA7JuQ7ZWY66+A66GcLCAtLeuhnCDsi5zsnpHtlZjripQg7Ji17IWY6rO8IOq3uCDqsJLsnYQg7ZWE7YSw66eB7ZWp64uI64ukLlxuICAgIC8vIOyYteyFmCDtjIzsi7HsnYAg6rCBIHJ1bm5lciDtlajsiJjsl5DshJwg7JuQ67O4IHByb2Nlc3MuYXJnduulvCDsgqzsmqntlZjsl6wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIFwiLS1cIihiYXJlIGRvdWJsZSBkYXNoKeuKlCBwYXNzdGhyb3VnaCDqtazrtoTsnpDsnbTrr4DroZwsIOq3uCDrkqTsnZgg66qo65OgIOyduOyekOuPhCDsoJzsmbjtlanri4jri6QuXG4gICAgY29uc3QgZmlsdGVyZWRBcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBza2lwTmV4dCA9IGZhbHNlO1xuICAgIGxldCBhZnRlckRvdWJsZURhc2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXJnID0gcHJvY2Vzcy5hcmd2W2ldO1xuICAgICAgaWYgKGFyZyA9PT0gXCItLVwiKSB7XG4gICAgICAgIGFmdGVyRG91YmxlRGFzaCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFmdGVyRG91YmxlRGFzaCkgY29udGludWU7XG4gICAgICBpZiAoc2tpcE5leHQpIHtcbiAgICAgICAgc2tpcE5leHQgPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi53snYAg7J20IGFyZ+unjCDsiqTtgrVcbiAgICAgICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAtLW9wdGlvbiB2YWx1ZSDtmJXsi53snbjsp4Ag7ZmV7J24OiDri6TsnYwgYXJn6rCAIC0t66GcIOyLnOyeke2VmOyngCDslYrsnLzrqbQg6rCS7J20IOyeiOuKlCDqsoNcbiAgICAgICAgY29uc3QgbmV4dEFyZyA9IHByb2Nlc3MuYXJndltpICsgMV07XG4gICAgICAgIGlmIChuZXh0QXJnICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItLVwiKSAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNraXBOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKGFyZyk7XG4gICAgfVxuXG4gICAgLy8gYnVpbGQvZGV2IOuqheugueyWtOqwgCDshJzruIzsu6Trp6jrk5wg7JeG7J20IO2YuOy2nOuQoCDrlYwgXCJhbGxcIuydhCDquLDrs7jqsJLsnLzroZwg7LaU6rCA7ZWp64uI64ukLlxuICAgIC8vIOyYiDogYHNvbmFtdSBidWlsZGAg4oaSIGBzb25hbXUgYnVpbGQgYWxsYCwgYHNvbmFtdSBkZXZgIOKGkiBgc29uYW11IGRldiBhbGxgXG4gICAgY29uc3QgY21kID0gZmlsdGVyZWRBcmd2WzJdO1xuICAgIGlmICgoY21kID09PSBcImJ1aWxkXCIgfHwgY21kID09PSBcImRldlwiKSAmJiBmaWx0ZXJlZEFyZ3YubGVuZ3RoID09PSAzKSB7XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChcImFsbFwiKTtcbiAgICB9XG5cbiAgICAvLyB0ZXN0IOy7pOunqOuTnOuKlCDqsIDrs4Ag7J247J6QKO2MjOydvOuqhSwgLS1wYXR0ZXJuIOuTsSnrpbwg67Cb7Jy866+A66GcIHRzaWNsaeulvCDsmrDtmoztlanri4jri6QuXG4gICAgaWYgKGNtZCA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIHJldHVybiB0ZXN0Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInN0YXR1c1wiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2Zvcm1cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcImNvbmVcIiwgXCJnZW5cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInN5bmNcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcInN0YXJ0XCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJzeW5jXCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJjcmVhdGVcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1widGVzdFwiXSxcbiAgICAgICAgW1wiYXV0aFwiLCBcImdlbmVyYXRlXCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiYWRkLWNvbXBhbmlvbnNcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIG1pZ3JhdGVfZ2VuZXJhdGUsXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICAgIFwiYXV0aF9hZGQtY29tcGFuaW9uc1wiOiBhdXRoX2FkZF9jb21wYW5pb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICpcbiAqIGAtLWZvcmNlYCDsmLXshZjsnbQg7KO87Ja07KeA66m0IGxvY2vsnYQg66y07Iuc7ZWY6rOgIO2SgC3si7Htgazrpbwg7IiY7ZaJ7ZWp64uI64ukLlxuICogZ2l0IHBvc3QtbWVyZ2UgaG9va+ydtOuCmCBDSeyXkOyEnCDrp6QgcHVsbCDtm4Qg7J6Q64+ZIOyLpO2Wie2VoCDsiJgg7J6I64+E66GdIOuFuOy2nC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luYygpIHtcbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGlmIChmbGFncy5oYXMoXCJmb3JjZVwiKSkge1xuICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuZm9yY2VTeW5jKCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5zeW5jKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgXCItLW9uLWtleT1jOmNsZWFyOkNsZWFyIHNjcmVlblwiLCAvLyBjIOuIhOultOuptCDthLDrr7jrhJAg7ZmU66m07J2EIOyngOybjOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBsb2NrIOygnOqxsCDtm4Qg7J6s7Iuc7J6RIOKGkiDsg4gg7ZSE66Gc7IS47Iqk6rCAIOu2gO2KuOyKpO2KuOueqeyXkOyEnCDtkoAt7Iux7YGsLiBmb3JjZSBzeW5jIENMSeulvCBzaGVsbOuhnCDrtoDrpbTrqbQg7IK07JWE7J6I64qUIOyEnOuyhOydmCB3YXRjaGVyIO2Pre2SjeydtCA6cmVzdGFydOyZgCDstqnrj4ztlbQg7IOB7YOcIOydtOyDgS5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgICAgLi4ub3B0aW9ucz8uZXh0cmFFbnYsXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLy8g7KKF66OMIOyymOumrFxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIlxcblxcbvCfkYsgU2h1dHRpbmcgZG93bi4uLlwiKSk7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgY2xlYW51cCk7XG5cbiAgc2VydmVyUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IC8gcG5wbSBkZXYgYWxsIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq47JeQIOuMgO2VtCBITVIg7KeA7JuQ7ZWY64qUIOqwnOuwnCDshJzrsoTrpbwg652E7JuM7KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hbGwoKSB7XG4gIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIGNvbnN0IHsgdmVyc2lvbiB9ID0gcmVxdWlyZShcIi4uLy4uL3BhY2thZ2UuanNvblwiKTtcbiAgY29uc29sZS5sb2coYPCfjLIgU29uYW11IHYke3ZlcnNpb259XFxuYCk7XG4gIHNwYXduQXBpRGV2U2VydmVyKCk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIOyghOyaqSDqsJzrsJwg7ISc67KE66W8IOudhOybgeuLiOuLpC5cbiAqIGRldl9hbGzqs7wg6rGw7J2YIOuPmeydvO2VmOuQmCwg7Ya17ZWpIOybuSDshJzrsoTrpbwg67mE7Zmc7ISx7ZmU7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hcGkoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgU29uYW11IEFQSS1vbmx5IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuICBzcGF3bkFwaURldlNlcnZlcih7XG4gICAgZXh0cmFFbnY6IHsgU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI6IFwieWVzXCIgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogVml0ZSDqsJzrsJwg7ISc67KE66W8IOuLqOuPheycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKiAtLSDrkqTsnZgg7J247J6Q64qUIFZpdGXsl5Ag6re464yA66GcIOyghOuLrOuQqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXZfd2ViKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAtLSDrkqTsnZgg7J247J6QIOy2lOy2nFxuICBjb25zdCBkb3VibGVEYXNoSW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZihcIi0tXCIpO1xuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBkb3VibGVEYXNoSW5kZXggIT09IC0xID8gcHJvY2Vzcy5hcmd2LnNsaWNlKGRvdWJsZURhc2hJbmRleCArIDEpIDogW107XG5cbiAgY29uc3Qgdml0ZUFyZ3MgPSBbXCJleGVjXCIsIFwidml0ZVwiLCAuLi5wYXNzdGhyb3VnaEFyZ3NdO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgVml0ZSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcblxuICBjb25zdCB2aXRlUHJvY2VzcyA9IHNwYXduKFwicG5wbVwiLCB2aXRlQXJncywge1xuICAgIGN3ZDogd2ViUGF0aCxcbiAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gIH0pO1xuXG4gIHZpdGVQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICB9KTtcblxuICAvLyBTSUdJTlQvU0lHVEVSTSDsi5wgVml0ZSDtlITroZzshLjsiqTrpbwgZ3JhY2VmdWxseSDsooXro4ztlanri4jri6QuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIl0gYXMgY29uc3QpIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgdml0ZVByb2Nlc3Mua2lsbChzaWduYWwpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQVBJIOu5jOuTnCDshKTsoJUg7YyM7J28IOqyveuhnOulvCDqsrDsoJXtlanri4jri6QuXG4gKiDtlITroZzsoJ3tirgg66Oo7Yq47JeQIGB0c2Rvd24uY29uZmlnLnRzYOqwgCDsnojsnLzrqbQg6re46rKD7J2ELCDsl4bsnLzrqbQgc29uYW11IOq4sOuzuCDshKTsoJXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpQnVpbGRDb25maWdQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRzZG93bi5jb25maWcudHNcIik7XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGxvY2FsQ29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIHRzZG93bi5jb25maWcudHMgZnJvbSBwcm9qZWN0IHJvb3QuLi5cIikpO1xuICAgICAgcmV0dXJuIGxvY2FsQ29uZmlnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyBkZWZhdWx0IHRzZG93biBBUEkgY29uZmlnIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcudHNcIik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIEFQSSBidWlsZCBjb25maWcgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBjb25maWdGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoKTtcblxuICBjb25zdCBhcGlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGggfSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIHdlYiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIFdlYiDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX3dlYih7IHNraXBJZk1pc3NpbmcgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3QsIFwid2ViXCIpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJQYXRoKSkpIHtcbiAgICBpZiAoc2tpcElmTWlzc2luZykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIldlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866+A66GcIFdlYiDruYzrk5zrpbwg6rG064SI65yB64uI64ukLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCB3ZWJTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgV0VCX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHByZS1idWlsZCwgYnVpbGQsIHBvc3QtYnVpbGQg64uo6rOE66W8IOyInOywqOyggeycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHM8VD4oXG4gIGFydGlmYWN0OiBCdWlsZEFydGlmYWN0PFQ+LFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nOyBidWlsZENvbW1hbmRBcmdzOiBUIH0sXG4pIHtcbiAgY29uc3Qgc3RlcHMgPSBbXG4gICAgeyBuYW1lOiBcInByZS1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnByZUJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgICB7IG5hbWU6IFwiYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5idWlsZENvbW1hbmQob3B0aW9ucy5idWlsZENvbW1hbmRBcmdzKSB9LFxuICAgIHsgbmFtZTogXCJwb3N0LWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucG9zdEJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgXS5maWx0ZXIoKHN0ZXApID0+IHN0ZXAuY21kKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RlcCA9IHN0ZXBzW2ldO1xuICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHN0ZXBzLmxlbmd0aCAtIDE7XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHN0ZXAuY21kKTtcbiAgICAgIHByaW50VGFza1N0YXJ0KHN0ZXAubmFtZSwgc3RlcC5jbWQsIGlzTGFzdCk7XG4gICAgICBhd2FpdCBleGVjV2l0aExpbmVQcmVmaXgoc3RlcC5jbWQsIHsgY3dkOiBvcHRpb25zLmN3ZCB9KTtcbiAgICAgIHByaW50VGFza1N1Y2Nlc3Moc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByaW50VGFza0ZhaWxlZChzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RlcC5uYW1lfSBmYWlsZWRgLCB7IGNhdXNlOiBlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc3RhcnQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDruYzrk5zrkJwg7ZSE66Gc7KCd7Yq466W8IOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDruYzrk5zrkJwg6rKw6rO866y8KGRpc3Qg65SU66CJ7Yag66as7J2YIGluZGV4LmpzIOyXlO2KuOumrO2PrOyduO2KuCnsnbQg7JeG64uk66m0IOyLpO2WieydhCDspJHri6jtlanri4jri6QuXG4gKiDshozsiqTrp7Ug7KeA7JuQ6rO8IGRvdGVudiDsp4Dsm5DsnYQg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpO1xuICBjb25zb2xlLmxvZyhg8J+MsiBTb25hbXUgdiR7dmVyc2lvbn1cXG5gKTtcblxuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfZ2VuZXJhdGUoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCB7IGNvbm5zIH0gPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgY29uc3QgaGFzU3RhdHVzMCA9IGNvbm5zLnNvbWUoKGNvbm4pID0+IGNvbm4uc3RhdHVzID09PSAwKTtcbiAgaWYgKCFoYXNTdGF0dXMwKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi66eI7J206re466CI7J207IWYIO2MjOydvOydhCDsg53shLHtlZjroKTrqbQg6riw7KG0IOuniOydtOq3uOugiOydtOyFmOydtCDstZzshowg7ZWY64KY7J2YIERC7JeQIOuqqOuRkCDsoIHsmqnrkJjslrQg7J6I7Ja07JW8IO2VqeuLiOuLpC5cIixcbiAgICAgICksXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGNvbm4gb2YgY29ubnMpIHtcbiAgICAgIGlmIChjb25uLnBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgJHtjb25uLm5hbWV9OiBwZW5kaW5nICR7Y29ubi5wZW5kaW5nLmxlbmd0aH3qsJxgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGNvdW50ID0gYXdhaXQgbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk7XG4gIGlmIChjb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgJHtjb3VudH3qsJzsnZgg66eI7J206re466CI7J207IWYIO2MjOydvOydtCDsg53shLHrkJjsl4jsirXri4jri6QuYCkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBiIC0gYSk7XG5cbiAgICBpZiAoZmlsdGVyZWRTZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZFNlcXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgY3VycmVudFNlcU5vID0gbWF4U2VxTm8gKyAxO1xuICBjb25zdCBmaWxlTmFtZSA9IGBwJHtjdXJyZW50U2VxTm99LSR7bmFtZX0udHNgO1xuICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHByYWN0aWNlRGlyLCBmaWxlTmFtZSk7XG5cbiAgY29uc3QgY29kZSA9IFtcbiAgICBgaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXCJcIixcbiAgICBgY29uc29sZS5jbGVhcigpO2AsXG4gICAgYGNvbnNvbGUubG9nKFwiJHtmaWxlTmFtZX1cIik7YCxcbiAgICBcIlwiLFxuICAgIGBTb25hbXUucnVuU2NyaXB0KGFzeW5jICgpID0+IHtgLFxuICAgIGAgLy8gVE9ET2AsXG4gICAgYH0pO2AsXG4gICAgXCJcIixcbiAgXS5qb2luKFwiXFxuXCIpO1xuICBhd2FpdCB3cml0ZUZpbGUoZHN0UGF0aCwgY29kZSk7XG5cbiAgZXhlY1N5bmMoYGNvZGUgJHtkc3RQYXRofWApO1xuXG4gIGNvbnN0IHJ1bkNvZGUgPSBgeWFybiBub2RlIC1yIGRvdGVudi9jb25maWcgLS1lbmFibGUtc291cmNlLW1hcHMgZGlzdC9wcmFjdGljZXMvJHtmaWxlTmFtZS5yZXBsYWNlKFxuICAgIFwiLnRzXCIsXG4gICAgXCIuanNcIixcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQsIHRpdGxlOiBlbnRpdHlJZCB9KTtcblxuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgdXNlQUkgPSBmbGFncy5oYXMoXCJhaVwiKTtcbiAgY29uc3Qgbm9Db25lcyA9IGZsYWdzLmhhcyhcIm5vLWNvbmVzXCIpO1xuXG4gIC8vIC0tbm8tY29uZXM6IGNvbmUg7IOd7ISxIOyKpO2CtVxuICBpZiAobm9Db25lcykge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRob3V0IGNvbmVzYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgaWYgKCFlbnRpdHkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC0tYWk6IExMTeycvOuhnCBjb25lIOyDneyEsVxuICBpZiAodXNlQUkpIHtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWRgKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMuLi5gKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6IGZhbHNlLFxuICAgICAgICBvbmx5RW1wdHk6IGZhbHNlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coYOKchSBEb25lICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMpYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFJlbW92ZSAtLWFpIGZsYWcgdG8gdXNlIHRlbXBsYXRlIGNvbmVzIGluc3RlYWRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDquLDrs7g6IO2FnO2UjOumvyBjb25lIOyekOuPmSDsg53shLFcbiAgLy8gTExNIOyXhuydtCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgLy8g7J2066W8IO2Gte2VtCBBTlRIUk9QSUNfQVBJX0tFWeqwgCDsl4bslrTrj4QgU29uYW1166W8IOyCrOyaqe2VoCDsiJgg7J6I7Jy866mwLFxuICAvLyDsg53shLHrkJwg7YWc7ZSM66a/IGNvbmXsnYAg64KY7KSR7JeQICdjb25lIGdlbicg66qF66C57Ja066GcIEFJ66W8IO2Gte2VtCDsl4Xqt7jroIjsnbTrk5ztlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyB0ZW1wbGF0ZSBjb25lcy4uLmApO1xuICBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKCk7XG4gIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRoIHRlbXBsYXRlIGNvbmVzYCk7XG4gIGNvbnNvbGUubG9nKGDwn5KhIFRpcDogUnVuICdwbnBtIHNvbmFtdSBjb25lIGdlbiAke2VudGl0eUlkfScgdG8gaW1wcm92ZSB3aXRoIEFJYCk7XG59XG5cbi8qKlxuICogQUnrpbwg7IKs7Jqp7ZWY7JesIGVudGl0eeydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlZjqsbDrgpgg7JeF6re466CI7J2065Oc7ZWp64uI64ukLlxuICpcbiAqIOyYteyFmDpcbiAqIC0gLS1yZWdlbmVyYXRlOiDsoITssrQg7J6s7IOd7ISxICjquLDsobQgY29uZSDrja7slrTsk7DquLApXG4gKiAtIC0tbG9jYWxlIDxrb3xlbnxqYT46IOyDneyEsSDslrjslrQg7KeA7KCVXG4gKiAtIOq4sOuzuDogb25seUVtcHR5IOuqqOuTnCAo6riw7KG0IGZpeHR1cmVIaW50IOuztOyhtClcbiAqXG4gKiBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQgKHNvbmFtdS5zZWNyZXQudHMg65iQ64qUIO2ZmOqyveuzgOyImClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZV9nZW4oZW50aXR5SWQ6IHN0cmluZykge1xuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgeyBmbGFncywgb3B0aW9ucyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG5cbiAgLy8gLS1hbGwg7Ji17IWYOiDrqqjrk6AgZW50aXR5IGNvbmUg7IOd7ISxXG4gIGlmIChmbGFncy5oYXMoXCJhbGxcIikgfHwgZW50aXR5SWQgPT09IFwiYWxsXCIpIHtcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMgZm9yICR7YWxsRW50aXRpZXMubGVuZ3RofSBlbnRpdGllcy4uLlxcbmApO1xuXG4gICAgbGV0IHRvdGFsVG9rZW5zID0gMDtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYFByb2Nlc3NpbmcgJHtlbnRpdHkuaWR9Li4uYCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IG9wdGlvbnMubG9jYWxlIHx8IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG90YWxUb2tlbnMgKz0gcmVzdWx0LnRva2Vuc1VzZWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIOKckyAke2VudGl0eS5pZH0gKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylcXG5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICBlcnJvcnMucHVzaChgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAg4pyXICR7ZW50aXR5LmlkfTogJHttZXNzYWdlfVxcbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG7inIUgRG9uZSEgVG90YWw6ICR7dG90YWxUb2tlbnN9IHRva2VucyB1c2VkYCk7XG4gICAgY29uc3QgZXN0aW1hdGVkQ29zdCA9ICh0b3RhbFRva2VucyAqIDkpIC8gMV8wMDBfMDAwO1xuICAgIGNvbnNvbGUubG9nKGDwn5KwIEVzdGltYXRlZCBjb3N0OiB+JCR7ZXN0aW1hdGVkQ29zdC50b0ZpeGVkKDQpfWApO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIGVudGl0aWVzICgke2Vycm9ycy5sZW5ndGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOuLqOydvCBlbnRpdHkgY29uZSDsg53shLFcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kZSA9IGZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIikgPyBcInJlZ2VuZXJhdGluZ1wiIDogXCJnZW5lcmF0aW5nXCI7XG4gIGNvbnNvbGUubG9nKFxuICAgIGDwn4yfICR7bW9kZSA9PT0gXCJyZWdlbmVyYXRpbmdcIiA/IFwiUmVnZW5lcmF0aW5nXCIgOiBcIkdlbmVyYXRpbmdcIn0gQUktcG93ZXJlZCBjb25lcyBmb3IgJHtlbnRpdHlJZH0uLi5gLFxuICApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIiA/IGNvbmZpZ0xvY2FsZSA6IFwia29cIjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgb25seUVtcHR5OiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgIGxvY2FsZSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinIUgRG9uZSEgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucyB1c2VkKWApO1xuXG4gICAgLy8g7Yag7YGwIOu5hOyaqSDqs4TsgrAgKOuMgOueteyggeyduCDstpTsoJUpXG4gICAgLy8gQ2xhdWRlIFNvbm5ldCA0LjU6IGlucHV0ICQzL00gdG9rZW5zLCBvdXRwdXQgJDE1L00gdG9rZW5zXG4gICAgLy8g6rCE64uo7ZWY6rKMIO2Pieq3oCAkOS9NIHRva2Vuc+uhnCDqs4TsgrBcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHJlc3VsdC50b2tlbnNVc2VkICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVlcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBUbyB1c2UgQUktcG93ZXJlZCBjb25lIGdlbmVyYXRpb246YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgIDEuIEdldCBhbiBBUEkga2V5IGZyb20gaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYCAgIDIuIEFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzIG9yIHNldCBBTlRIUk9QSUNfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSYXRlIGxpbWl0XCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgdG8gZ2VuZXJhdGUgY29uZXM6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogVW5rbm93biBlcnJvcmApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDqs7Xsi50gU2tpbGxz66W8IOuhnOy7rCDtlITroZzsoJ3tirgg65iQ64qUIOq4gOuhnOuyjCB+Ly5jbGF1ZGUv66GcIOuPmeq4sO2ZlO2VqeuLiOuLpC5cbiAqXG4gKiAtLWdsb2JhbCDtlIzrnpjqt7g6IH4vLmNsYXVkZS/sl5Ag64+Z6riw7ZmUICjtlITroZzsoJ3tirgg7IOd7ISxIOyghCDsgqzsmqkg6rCA64qlKVxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luYygpIHtcbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGNvbnN0IGlzR2xvYmFsID0gZmxhZ3MuaGFzKFwiZ2xvYmFsXCIpO1xuXG4gIC8vIOqwnOuwnCDtmZjqsr0gLSBjbGkudHM6IHNvbmFtdS9tb2R1bGVzL3NvbmFtdS9zcmMvYmluL2NsaS50c1xuICAvLyDruYzrk5wg7ZuEIC0gY2xpLmpzOiBub2RlX21vZHVsZXMvc29uYW11L2Rpc3QvYmluL2NsaS5qcyAo7Iuk7KCcIOyLpO2WiSlcbiAgLy8gc2tpbGxzIOychOy5mDogbm9kZV9tb2R1bGVzL3NvbmFtdS9zcmMvc2tpbGxzIChucG0g67Cw7Y+sIOyLnClcbiAgY29uc3Qgc291cmNlQmFzZSA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJzcmNcIiwgXCJza2lsbHNcIik7XG4gIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcInNvbmFtdVwiKTtcbiAgY29uc3Qgc291cmNlQ2xhdWRlTWQgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJDTEFVREUubWRcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHNvdXJjZVNraWxsc0RpcikpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiU2tpbGxzIHNvdXJjZSBub3QgZm91bmQgaW4gc29uYW11IHBhY2thZ2UuXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNHbG9iYWwpIHtcbiAgICBjb25zdCBob21lQ2xhdWRlRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgXCIuY2xhdWRlXCIpO1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKGhvbWVDbGF1ZGVEaXIsIHNvdXJjZVNraWxsc0Rpciwgc291cmNlQ2xhdWRlTWQsIHtcbiAgICAgIHVzZVN5bWxpbms6IGZhbHNlLFxuICAgICAgY29weVByb2plY3RUZW1wbGF0ZXM6IGZhbHNlLFxuICAgICAgaXNHbG9iYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyB+Ly5jbGF1ZGUvY29tbWFuZHMvc29uYW11LXNraWxscy5tZCDshKTsuZhcbiAgICBjb25zdCBzb3VyY2VDb21tYW5kc0RpciA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcImNvbW1hbmRzXCIpO1xuICAgIGNvbnN0IHNvdXJjZUNvbW1hbmQgPSBwYXRoLmpvaW4oc291cmNlQ29tbWFuZHNEaXIsIFwic29uYW11LXNraWxscy5tZFwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHNvdXJjZUNvbW1hbmQpKSB7XG4gICAgICBjb25zdCB0YXJnZXRDb21tYW5kc0RpciA9IHBhdGguam9pbihob21lQ2xhdWRlRGlyLCBcImNvbW1hbmRzXCIpO1xuICAgICAgYXdhaXQgbWtkaXIodGFyZ2V0Q29tbWFuZHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgY3Aoc291cmNlQ29tbWFuZCwgcGF0aC5qb2luKHRhcmdldENvbW1hbmRzRGlyLCBcInNvbmFtdS1za2lsbHMubWRcIikpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAvc29uYW11LXNraWxscyBjb21tYW5kIGluc3RhbGxlZCDihpIgfi8uY2xhdWRlL2NvbW1hbmRzL2ApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4gIEdsb2JhbCBzeW5jIGNvbXBsZXRlIOKGkiB+Ly5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFRoZXNlIHNraWxscyBhcmUgYXZhaWxhYmxlIGluIGFsbCBDbGF1ZGUgQ29kZSBzZXNzaW9ucy5gKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oXG4gICAgICAgIGAgIE9uY2UgYSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHJ1biAncG5wbSBzb25hbXUgc2tpbGxzIHN5bmMnIGZvciBwcm9qZWN0LWxvY2FsIHN5bmMuYCxcbiAgICAgICksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUm9vdCwgXCIuY2xhdWRlXCIpO1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKGNsYXVkZURpciwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogdHJ1ZSxcbiAgICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiB0cnVlLFxuICAgICAgc291cmNlQmFzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGNsYXVkZURpcuuhnCBza2lsbHPrpbwg64+Z6riw7ZmU7ZWY64qUIOqzte2GtSDroZzsp4HsnoXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jX3RvKFxuICBjbGF1ZGVEaXI6IHN0cmluZyxcbiAgc291cmNlU2tpbGxzRGlyOiBzdHJpbmcsXG4gIHNvdXJjZUNsYXVkZU1kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICB1c2VTeW1saW5rOiBib29sZWFuO1xuICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiBib29sZWFuO1xuICAgIHNvdXJjZUJhc2U/OiBzdHJpbmc7XG4gICAgaXNHbG9iYWw/OiBib29sZWFuO1xuICB9LFxuKSB7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIOyerOyDneyEsVxuICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgdHJ5IHtcbiAgICBhd2FpdCBybSh0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7YyM7J287J20IOyXhuycvOuptCDrrLTsi5xcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXRTa2lsbHNEaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBpZiAob3B0aW9ucy51c2VTeW1saW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN5bWxpbmsoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIFwiZGlyXCIpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgRmFsbGluZyBiYWNrIHRvIGNvcHkuLi5gKSk7XG4gICAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0Rpcik7XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGlmIChvcHRpb25zLmNvcHlQcm9qZWN0VGVtcGxhdGVzICYmIG9wdGlvbnMuc291cmNlQmFzZSkge1xuICAgIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5zb3VyY2VCYXNlLCBcInByb2plY3RcIik7XG4gICAgY29uc3QgdGFyZ2V0UHJvamVjdERpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdFwiKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyh0YXJnZXRQcm9qZWN0RGlyKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFByb2plY3QgdGVtcGxhdGVzIGluaXRpYWxpemVkYCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvamVjdCB0ZW1wbGF0ZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIFByb2plY3QgdGVtcGxhdGVzIGFscmVhZHkgZXhpc3QgKHByZXNlcnZlZClgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0dGluZ3MubG9jYWwuanNvbiDigJQgcHJvamVjdC1sb2NhbCDrqqjrk5zsl5DshJzrp4wsIOyXhuydhCDrlYzrp4wg7IOd7ISxXG4gIGlmIChvcHRpb25zLmNvcHlQcm9qZWN0VGVtcGxhdGVzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3NMb2NhbFBhdGggPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcInNldHRpbmdzLmxvY2FsLmpzb25cIik7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNldHRpbmdzTG9jYWxQYXRoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzQ29udGVudCA9IHtcbiAgICAgICAgICBob29rczoge1xuICAgICAgICAgICAgUG9zdFRvb2xVc2U6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hdGNoZXI6IFwiRWRpdHxXcml0ZXxNdWx0aUVkaXRcIixcbiAgICAgICAgICAgICAgICBob29rczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNvbW1hbmRcIixcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogXCJwbnBtIGNoZWNrIDI+JjEgfCBoZWFkIC02MFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoc2V0dGluZ3NMb2NhbFBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzQ29udGVudCwgbnVsbCwgMil9XFxuYCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgLmNsYXVkZS9zZXR0aW5ncy5sb2NhbC5qc29uIGNyZWF0ZWRgKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGNyZWF0ZSBzZXR0aW5ncy5sb2NhbC5qc29uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIC5jbGF1ZGUvc2V0dGluZ3MubG9jYWwuanNvbiBhbHJlYWR5IGV4aXN0cyAocHJlc2VydmVkKWApKTtcbiAgICB9XG4gIH1cblxuICAvLyBDTEFVREUubWQg67O17IKsL+yXheuNsOydtO2KuFxuICBpZiAoYXdhaXQgZXhpc3RzKHNvdXJjZUNsYXVkZU1kKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRDbGF1ZGVNZCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwiQ0xBVURFLm1kXCIpO1xuICAgICAgY29uc3QgcmF3Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHNvdXJjZUNsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgLy8g6riA66Gc67KMIOuqqOuTnOyXkOyEnOuKlCDsg4HrjIAg6rK966Gc66W8IOygiOuMgCDqsr3roZzroZwg67OA7ZmY7ZWp64uI64ukXG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gb3B0aW9ucy5pc0dsb2JhbFxuICAgICAgICA/IHJhd0NvbnRlbnQucmVwbGFjZUFsbChcIi5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9cIiwgXCJ+Ly5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9cIilcbiAgICAgICAgOiByYXdDb250ZW50O1xuXG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKHRhcmdldENsYXVkZU1kKSkge1xuICAgICAgICBjb25zdCB0YXJnZXRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUodGFyZ2V0Q2xhdWRlTWQsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gXCI8IS0tIFNPTkFNVTpTVEFSVCAtLT5cIjtcbiAgICAgICAgY29uc3QgZW5kTWFya2VyID0gXCI8IS0tIFNPTkFNVTpFTkQgLS0+XCI7XG4gICAgICAgIGlmICh0YXJnZXRDb250ZW50LmluY2x1ZGVzKHN0YXJ0TWFya2VyKSAmJiB0YXJnZXRDb250ZW50LmluY2x1ZGVzKGVuZE1hcmtlcikpIHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihzdGFydE1hcmtlcik7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKGVuZE1hcmtlcik7XG5cbiAgICAgICAgICBpZiAoc3RhcnRJZHggIT09IC0xICYmIGVuZElkeCAhPT0gLTEgJiYgc3RhcnRJZHggPCBlbmRJZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKDAsIHN0YXJ0SWR4KTtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoZW5kSWR4ICsgZW5kTWFya2VyLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7YmVmb3JlfSR7c3RhcnRNYXJrZXJ9XFxuJHtzb3VyY2VDb250ZW50fVxcbiR7ZW5kTWFya2VyfSR7YWZ0ZXJ9YDtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgbmV3Q29udGVudCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCB1cGRhdGVkIChtYXJrZXIgcmVnaW9uKWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDij60gQ0xBVURFLm1kIG1hcmtlciBwb3NpdGlvbnMgaW52YWxpZCwgc2tpcHBlZGApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g66eI7Luk6rCAIOyXhuuKlCDquLDsobQgQ0xBVURFLm1k7JeQIFNvbmFtdSDshLnshZjsnYQg7LaU6rCA7ZWp64uI64ukXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBgJHt0YXJnZXRDb250ZW50LnRyaW1FbmQoKX1cXG5cXG48IS0tIFNPTkFNVTpTVEFSVCAtLT5cXG4ke3NvdXJjZUNvbnRlbnR9XFxuPCEtLSBTT05BTVU6RU5EIC0tPlxcbmA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBhcHBlbmRlZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAoYXBwZW5kZWQgU29uYW11IHNlY3Rpb24pYCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3aXRoTWFya2VycyA9IGA8IS0tIFNPTkFNVTpTVEFSVCAtLT5cXG4ke3NvdXJjZUNvbnRlbnR9XFxuPCEtLSBTT05BTVU6RU5EIC0tPlxcbmA7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgd2l0aE1hcmtlcnMpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCBjcmVhdGVkYCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYOKclyBGYWlsZWQgdG8gdXBkYXRlIENMQVVERS5tZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc0NvcHkoc3JjOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGNwKHNyYywgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgY29waWVkYCkpO1xuICB9IGNhdGNoIChjb3B5RXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBg4pyXIEZhaWxlZCB0byBjb3B5IHNraWxsczogJHtjb3B5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNvcHlFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNvcHlFcnJvcil9YCxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aHJvdyBjb3B5RXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgY3JlYXRlIDxuYW1lPiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOuhnOy7rCBza2lsbCDstIjslYjsnYQg7IOd7ISx7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfY3JlYXRlKG5hbWU6IHN0cmluZykge1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgbG9jYWxEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUm9vdCwgXCIuY2xhdWRlXCIsIFwic2tpbGxzXCIsIFwibG9jYWxcIik7XG5cbiAgLy8gPT09IO2MjOydvOuqhSDqsoDspp0g67CPIFNhbml0aXplID09PVxuICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkgPT09IFwiXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIuKclyBTa2lsbCBuYW1lIGlzIHJlcXVpcmVkXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc2FuaXRpemVkID0gbmFtZVxuICAgIC8vIOqzteuwseydhCDtlZjsnbTtlIjsnLzroZxcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcbiAgICAvLyDqsr3roZwg6rWs67aE7J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bL1xcXFxdL2csIFwiLVwiKVxuICAgIC8vIFBhdGggdHJhdmVyc2FsIOuwqeyngFxuICAgIC5yZXBsYWNlKC9cXC5cXC4vZywgXCJcIilcbiAgICAvLyBXaW5kb3dzIOq4iOyngCDrrLjsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1s8PjpcInw/Kl0vZywgXCJcIilcbiAgICAvLyDsi5zsnpEv64GdIOygkCwg7ZWY7J207ZSILCDslrjrjZTsiqTsvZTslrQg7KCc6rGwXG4gICAgLnJlcGxhY2UoL15bLlxcLV9dK3xbLlxcLV9dKyQvZywgXCJcIilcbiAgICAvLyDsl7Dsho3rkJwg7ZWY7J207ZSI7J2EIO2VmOuCmOuhnFxuICAgIC5yZXBsYWNlKC8tKy9nLCBcIi1cIilcbiAgICAvLyDslYztjIzrsrMsIOyIq+yekCwg7ZWY7J207ZSILCDslrjrjZTsiqTsvZTslrQsIO2VnOq4gOunjCDtl4jsmqlcbiAgICAucmVwbGFjZSgvW15hLXpBLVowLTktX+qwgC3tnqNdL2csIFwiXCIpO1xuXG4gIC8vIOq4uOydtCDsoJztlZxcbiAgY29uc3QgTUFYX0xFTkdUSCA9IDEwMDtcbiAgaWYgKHNhbml0aXplZC5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnN1YnN0cmluZygwLCBNQVhfTEVOR1RIKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHRydW5jYXRlZCB0byAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgKSk7XG4gIH1cblxuICAvLyBXaW5kb3dzIOyYiOyVveyWtCDtmZXsnbhcbiAgY29uc3QgUkVTRVJWRURfTkFNRVMgPSBbXG4gICAgXCJDT05cIixcbiAgICBcIlBSTlwiLFxuICAgIFwiQVVYXCIsXG4gICAgXCJOVUxcIixcbiAgICBcIkNPTTFcIixcbiAgICBcIkNPTTJcIixcbiAgICBcIkNPTTNcIixcbiAgICBcIkNPTTRcIixcbiAgICBcIkNPTTVcIixcbiAgICBcIkNPTTZcIixcbiAgICBcIkNPTTdcIixcbiAgICBcIkNPTThcIixcbiAgICBcIkNPTTlcIixcbiAgICBcIkxQVDFcIixcbiAgICBcIkxQVDJcIixcbiAgICBcIkxQVDNcIixcbiAgICBcIkxQVDRcIixcbiAgICBcIkxQVDVcIixcbiAgICBcIkxQVDZcIixcbiAgICBcIkxQVDdcIixcbiAgICBcIkxQVDhcIixcbiAgICBcIkxQVDlcIixcbiAgXTtcbiAgaWYgKFJFU0VSVkVEX05BTUVTLmluY2x1ZGVzKHNhbml0aXplZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgIHNhbml0aXplZCA9IGBza2lsbC0ke3Nhbml0aXplZH1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIFJlc2VydmVkIG5hbWUgZGV0ZWN0ZWQsIHByZWZpeGVkIHdpdGggXCJza2lsbC1cImApKTtcbiAgfVxuXG4gIC8vIOu5iCDrrLjsnpDsl7Qg7LK07YGsXG4gIGlmIChzYW5pdGl6ZWQgPT09IFwiXCIpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIuKclyBJbnZhbGlkIHNraWxsIG5hbWUgYWZ0ZXIgc2FuaXRpemF0aW9uXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgT3JpZ2luYWw6IFwiJHtuYW1lfVwiYCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOuzgOqyvSDslYzrprxcbiAgaWYgKHNhbml0aXplZCAhPT0gbmFtZSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgc2FuaXRpemVkOiBcIiR7bmFtZX1cIiDihpIgXCIke3Nhbml0aXplZH1cImApKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGxvY2FsRGlyLCBgJHtzYW5pdGl6ZWR9Lm1kYCk7XG5cbiAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYFNraWxsIFwiJHtzYW5pdGl6ZWR9XCIgYWxyZWFkeSBleGlzdHMuYCkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKGxvY2FsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IGAtLS1cbm5hbWU6ICR7c2FuaXRpemVkfVxuY2F0ZWdvcnk6IG90aGVyXG5jcmVhdGVkX2F0OiAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF19XG5zdGF0dXM6IGRyYWZ0XG4tLS1cblxuIyAke3Nhbml0aXplZH1cblxuIyMg7IOB7ZmpXG5cblvslrTrlqQg66y47KCc7JiA64qU7KeAXVxuXG4jIyDtlbTqsrAg67Cp67KVXG5cblvslrTrlrvqsowg7ZW06rKw7ZaI64qU7KeAXVxuXG4jIyDsvZTrk5wg7JiI7IucXG5cblxcYFxcYFxcYHR5cGVzY3JpcHRcbi8vIOyYiOyLnCDsvZTrk5xcblxcYFxcYFxcYFxuYDtcblxuICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHRlbXBsYXRlKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzL2xvY2FsLyR7c2FuaXRpemVkfS5tZGApKTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBhdXRoIGdlbmVyYXRlIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogYmV0dGVyLWF1dGgg7JeU7Yuw7Yuw65OkKFVzZXIsIFNlc3Npb24sIEFjY291bnQsIFZlcmlmaWNhdGlvbinsnYQg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIOyYteyFmDpcbiAqIC0tcGx1Z2lucyBwaG9uZS1udW1iZXIsMmZhICDtlIzrn6zqt7jsnbgg7JeU7Yuw7Yuw64+EIO2VqOq7mCDsg53shLFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0aF9nZW5lcmF0ZSgpIHtcbiAgLy8gLS1wbHVnaW5zIOyYteyFmCDtjIzsi7FcbiAgY29uc3QgcGx1Z2luc0FyZyA9IHByb2Nlc3MuYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKFwiLS1wbHVnaW5zXCIpKTtcbiAgY29uc3QgcGx1Z2luczogQmV0dGVyQXV0aFBsdWdpbklkW10gPSBbXTtcblxuICBpZiAocGx1Z2luc0FyZykge1xuICAgIGNvbnN0IHBsdWdpblZhbHVlID0gcGx1Z2luc0FyZy5pbmNsdWRlcyhcIj1cIilcbiAgICAgID8gcGx1Z2luc0FyZy5zcGxpdChcIj1cIilbMV1cbiAgICAgIDogcHJvY2Vzcy5hcmd2W3Byb2Nlc3MuYXJndi5pbmRleE9mKHBsdWdpbnNBcmcpICsgMV07XG5cbiAgICBpZiAocGx1Z2luVmFsdWUpIHtcbiAgICAgIGNvbnN0IHBsdWdpbklkcyA9IHBsdWdpblZhbHVlLnNwbGl0KFwiLFwiKS5tYXAoKHApID0+IHAudHJpbSgpKTtcblxuICAgICAgZm9yIChjb25zdCBpZCBvZiBwbHVnaW5JZHMpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRQbHVnaW5JZChpZCkpIHtcbiAgICAgICAgICBwbHVnaW5zLnB1c2goaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIFVua25vd24gcGx1Z2luOiAke2lkfWApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgU3VwcG9ydGVkIHBsdWdpbnM6ICR7U1VQUE9SVEVEX1BMVUdJTl9JRFMuam9pbihcIiwgXCIpfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+UkCBHZW5lcmF0aW5nIGJldHRlci1hdXRoIGVudGl0aWVzLi4uXFxuXCIpKTtcblxuICBpZiAocGx1Z2lucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFBsdWdpbnM6ICR7cGx1Z2lucy5qb2luKFwiLCBcIil9YCkpO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMoeyBwbHVnaW5zIH0pO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IGF1dGggYWRkLWNvbXBhbmlvbnMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDquLDsobQg7ZSE66Gc7KCd7Yq47J2YIGVudGl0eS5qc29u7JeQIGZpeHR1cmVDb21wYW5pb25z66W8IOyGjOq4iSDstpTqsIDtlanri4jri6QuXG4gKlxuICog7J2066+4IGZpeHR1cmVDb21wYW5pb25z6rCAIOyeiOuKlCBlbnRpdHnripQg7Iqk7YK17ZWp64uI64ukICjrja7slrTsk7DquLAg7JeG7J2MKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXV0aF9hZGRfY29tcGFuaW9ucygpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEFkZGluZyBmaXh0dXJlQ29tcGFuaW9ucyB0byBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG4gIGF3YWl0IGFkZENvbXBhbmlvbnNUb0VudGl0aWVzKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJcXG7inIUgRG9uZSFcIikpO1xufVxuXG4vKipcbiAqIOybjO2BrOyKpO2OmOydtOyKpCDro6jtirjrpbwg7LC+7Iq164uI64ukLlxuICog7Jqw7ISg7Iic7JyEOiBwbnBtLXdvcmtzcGFjZS55YW1sID4gcGFja2FnZS5qc29uKHdvcmtzcGFjZXMpID4gLmFnZW50cy9cbiAqXG4gKiBDTEFVREUubWTripQg7ISc67iM7Yyo7YKk7KeA7JeQ64+EIOyhtOyerO2VoCDsiJgg7J6I7Jy866+A66GcIOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuXG4gKiAuYWdlbnRzL+uKlCBhZ2VudHMgaW5pdOydtCDsg53shLHtlZjripQg65SU66CJ7Yag66as66GcLCDsm4ztgazsiqTtjpjsnbTsiqQg66Oo7Yq47JeQ66eMIOyhtOyerO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVJvb3QoKSB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIHdoaWxlIChkaXIgIT09IHBhdGguZGlybmFtZShkaXIpKSB7XG4gICAgLy8gMS4gcG5wbS13b3Jrc3BhY2UueWFtbDog7ZmV7Iuk7ZWcIG1vbm9yZXBvIOujqO2KuC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMi4gcGFja2FnZS5qc29u7JeQIHdvcmtzcGFjZXMg7ZWE65Oc6rCAIOyeiOycvOuptCBtb25vcmVwbyDro6jtirguXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhY2thZ2VQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8g7YyM7IuxIOyLpO2MqOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiAuYWdlbnRzLzogYWdlbnRzIGluaXTsnbQg7IOd7ISx7ZWcIOuUlOugie2GoOumrC4g7ISc67iM7Yyo7YKk7KeA7JeQ64qUIOyhtOyerO2VmOyngCDslYrsnYwuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcIi5hZ2VudHNcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIGRpciA9IHBhdGguZGlybmFtZShkaXIpO1xuICB9XG5cbiAgLy8g7LC+7KeAIOuqu+2VmOuptCBhcGkg7Y+0642U7J2YIOu2gOuqqCDsgqzsmqlcbiAgcmV0dXJuIGZpbmRBcHBSb290UGF0aCgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBaUJ1QztxQkFLa0I7ZUFDUjtzQkFDVzttQkFRN0I7ZUFDWTtZQUN1QjtBQS9CbEUsT0FBTyxRQUFRO0FBcUNmLElBQUlBOzs7O0FBS0osU0FBUyxnQkFBZ0IsT0FBaUIsUUFBUSxNQUdoRDtDQUNBLE1BQU0sUUFBUSxJQUFJLEtBQWE7Q0FDL0IsTUFB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
|