sonamu 0.9.19 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +36 -0
  2. package/dist/ai/agents/agent.js +5 -7
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/agents/types.js +1 -1
  5. package/dist/ai/index.js +1 -2
  6. package/dist/ai/providers/rtzr/api.js +2 -3
  7. package/dist/ai/providers/rtzr/error.js +14 -29
  8. package/dist/ai/providers/rtzr/index.js +1 -2
  9. package/dist/ai/providers/rtzr/model.js +13 -20
  10. package/dist/ai/providers/rtzr/options.js +2 -3
  11. package/dist/ai/providers/rtzr/provider.js +2 -3
  12. package/dist/ai/providers/rtzr/utils.js +12 -21
  13. package/dist/api/base-frame.js +4 -4
  14. package/dist/api/caster.js +21 -38
  15. package/dist/api/code-converters.js +41 -98
  16. package/dist/api/config.d.ts +1 -10
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +9 -8
  19. package/dist/api/context.js +2 -3
  20. package/dist/api/decorators.js +80 -116
  21. package/dist/api/index.js +2 -3
  22. package/dist/api/secret.js +6 -10
  23. package/dist/api/sonamu.d.ts.map +1 -1
  24. package/dist/api/sonamu.js +200 -387
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +21 -32
  27. package/dist/auth/audit-log/builders.js +2 -3
  28. package/dist/auth/audit-log/events.js +2 -2
  29. package/dist/auth/audit-log/plugin.js +30 -61
  30. package/dist/auth/audit-log-ingestor.js +19 -41
  31. package/dist/auth/auth-generator.js +16 -41
  32. package/dist/auth/better-auth-entities.js +3 -4
  33. package/dist/auth/index.js +2 -3
  34. package/dist/auth/knex-adapter.js +18 -45
  35. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  36. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  37. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  38. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  39. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  40. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  41. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  42. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  43. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  44. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  45. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  47. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  48. package/dist/auth/plugins/index.js +1 -2
  49. package/dist/auth/plugins/wrappers/admin.js +2 -3
  50. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  51. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  52. package/dist/auth/plugins/wrappers/index.js +1 -2
  53. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  54. package/dist/auth/plugins/wrappers/organization.js +2 -3
  55. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  56. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  57. package/dist/auth/plugins/wrappers/sso.js +2 -3
  58. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  59. package/dist/auth/plugins/wrappers/username.js +2 -3
  60. package/dist/bin/build-config.js +2 -2
  61. package/dist/bin/cli.js +151 -258
  62. package/dist/bin/fixture.d.ts.map +1 -1
  63. package/dist/bin/fixture.js +55 -97
  64. package/dist/bin/hmr-hook-register.js +3 -3
  65. package/dist/bin/migrate-targets.d.ts +3 -0
  66. package/dist/bin/migrate-targets.d.ts.map +1 -0
  67. package/dist/bin/migrate-targets.js +11 -0
  68. package/dist/bin/test-command.js +25 -55
  69. package/dist/bin/ts-loader-register.js +5 -6
  70. package/dist/bin/ts-loader-registration.js +6 -13
  71. package/dist/cache/cache-manager.js +3 -4
  72. package/dist/cache/decorator.js +11 -21
  73. package/dist/cache/drivers.js +2 -3
  74. package/dist/cache/index.js +2 -3
  75. package/dist/cache/types.js +1 -1
  76. package/dist/cache-control/cache-control.js +21 -34
  77. package/dist/cache-control/types.js +1 -1
  78. package/dist/compress/compress.js +10 -10
  79. package/dist/compress/index.js +1 -2
  80. package/dist/compress/types.js +1 -1
  81. package/dist/cone/cone-generator.js +25 -63
  82. package/dist/database/_batch_update.js +26 -46
  83. package/dist/database/base-model.js +44 -97
  84. package/dist/database/base-model.types.js +1 -1
  85. package/dist/database/db.d.ts +8 -14
  86. package/dist/database/db.d.ts.map +1 -1
  87. package/dist/database/db.js +127 -72
  88. package/dist/database/knex.js +5 -8
  89. package/dist/database/puri-subset.types.js +1 -1
  90. package/dist/database/puri-wrapper.js +11 -15
  91. package/dist/database/puri.js +117 -234
  92. package/dist/database/puri.types.js +3 -4
  93. package/dist/database/transaction-context.js +4 -5
  94. package/dist/database/upsert-builder.js +109 -176
  95. package/dist/dict/en.d.ts +1 -0
  96. package/dist/dict/en.d.ts.map +1 -1
  97. package/dist/dict/en.js +4 -4
  98. package/dist/dict/index.js +2 -3
  99. package/dist/dict/ko.d.ts +1 -0
  100. package/dist/dict/ko.d.ts.map +1 -1
  101. package/dist/dict/ko.js +4 -4
  102. package/dist/dict/rc-keys.js +3 -4
  103. package/dist/dict/sd.js +8 -19
  104. package/dist/dict/sonamu-dictionary.js +141 -284
  105. package/dist/dict/types.js +1 -1
  106. package/dist/dict/utils.js +4 -5
  107. package/dist/entity/entity-manager.d.ts +2 -2
  108. package/dist/entity/entity-manager.js +34 -82
  109. package/dist/entity/entity-template-cone.js +33 -66
  110. package/dist/entity/entity.js +156 -310
  111. package/dist/env.d.ts +14 -0
  112. package/dist/env.d.ts.map +1 -0
  113. package/dist/env.js +75 -0
  114. package/dist/exceptions/error-handler.js +2 -3
  115. package/dist/exceptions/so-exceptions.js +7 -5
  116. package/dist/filter/index.js +1 -2
  117. package/dist/filter/types.js +3 -4
  118. package/dist/filter/utils.js +21 -54
  119. package/dist/index.js +8 -7
  120. package/dist/logger/category.js +6 -12
  121. package/dist/logger/configure.js +23 -34
  122. package/dist/migration/code-generation.js +146 -314
  123. package/dist/migration/index-where-predicate.js +52 -144
  124. package/dist/migration/migration-set.js +19 -33
  125. package/dist/migration/migrator.d.ts +2 -0
  126. package/dist/migration/migrator.d.ts.map +1 -1
  127. package/dist/migration/migrator.js +69 -53
  128. package/dist/migration/postgresql-schema-reader.js +126 -225
  129. package/dist/migration/slack-confirm.d.ts +1 -0
  130. package/dist/migration/slack-confirm.d.ts.map +1 -1
  131. package/dist/migration/slack-confirm.js +28 -38
  132. package/dist/migration/types.js +1 -1
  133. package/dist/naite/messaging-types.js +1 -1
  134. package/dist/naite/naite-reporter.js +15 -32
  135. package/dist/naite/naite.js +43 -76
  136. package/dist/ssr/index.js +6 -9
  137. package/dist/ssr/registry.js +10 -18
  138. package/dist/ssr/renderer.js +10 -21
  139. package/dist/ssr/types.js +1 -1
  140. package/dist/storage/base-file.js +5 -10
  141. package/dist/storage/buffered-file.js +3 -4
  142. package/dist/storage/drivers.js +2 -3
  143. package/dist/storage/index.js +2 -3
  144. package/dist/storage/s3-driver.js +5 -9
  145. package/dist/storage/storage-manager.js +5 -5
  146. package/dist/storage/types.js +1 -1
  147. package/dist/storage/uploaded-file.js +4 -6
  148. package/dist/stream/index.js +1 -2
  149. package/dist/stream/sse.js +8 -13
  150. package/dist/stream/ws-audience-resolver.js +5 -5
  151. package/dist/stream/ws-audience.js +3 -4
  152. package/dist/stream/ws-cluster-bus.js +3 -4
  153. package/dist/stream/ws-core.js +1 -1
  154. package/dist/stream/ws-delivery.js +11 -25
  155. package/dist/stream/ws-local-connection-store.js +9 -18
  156. package/dist/stream/ws-presence-store.js +43 -97
  157. package/dist/stream/ws-registry.js +17 -22
  158. package/dist/stream/ws-telemetry-memory.js +38 -45
  159. package/dist/stream/ws-telemetry-trace.js +4 -6
  160. package/dist/stream/ws-telemetry.js +82 -135
  161. package/dist/stream/ws.js +47 -91
  162. package/dist/syncer/api-parser.js +81 -147
  163. package/dist/syncer/checksum.js +9 -20
  164. package/dist/syncer/code-generator.js +29 -47
  165. package/dist/syncer/entity-operations.js +17 -27
  166. package/dist/syncer/event-batcher.js +8 -15
  167. package/dist/syncer/file-patterns.js +3 -4
  168. package/dist/syncer/file-tracking.js +6 -10
  169. package/dist/syncer/index.js +1 -2
  170. package/dist/syncer/module-loader.js +10 -26
  171. package/dist/syncer/syncer-actions.js +19 -37
  172. package/dist/syncer/syncer.js +46 -98
  173. package/dist/syncer/watcher.js +12 -26
  174. package/dist/tasks/decorator.js +7 -11
  175. package/dist/tasks/step-wrapper.js +7 -8
  176. package/dist/tasks/workflow-manager.js +18 -25
  177. package/dist/template/entity-converter.js +40 -64
  178. package/dist/template/helpers.js +32 -63
  179. package/dist/template/implementations/entity.template.js +7 -11
  180. package/dist/template/implementations/entry-server.template.js +2 -3
  181. package/dist/template/implementations/generated.template.js +25 -51
  182. package/dist/template/implementations/generated_http.template.js +31 -58
  183. package/dist/template/implementations/generated_sso.template.js +45 -85
  184. package/dist/template/implementations/init_types.template.js +4 -7
  185. package/dist/template/implementations/model.template.js +5 -10
  186. package/dist/template/implementations/model_test.template.js +2 -3
  187. package/dist/template/implementations/queries.template.js +4 -7
  188. package/dist/template/implementations/sd.template.js +17 -35
  189. package/dist/template/implementations/services.template.js +18 -30
  190. package/dist/template/implementations/view_form.template.js +72 -125
  191. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  192. package/dist/template/implementations/view_list.template.js +86 -143
  193. package/dist/template/implementations/view_search_input.template.js +2 -3
  194. package/dist/template/index.js +5 -8
  195. package/dist/template/template-manager.js +13 -26
  196. package/dist/template/template-types.js +2 -3
  197. package/dist/template/template.js +7 -11
  198. package/dist/template/zod-converter.js +173 -348
  199. package/dist/testing/_relation-graph.js +18 -37
  200. package/dist/testing/bootstrap.js +5 -8
  201. package/dist/testing/data-explorer.js +34 -78
  202. package/dist/testing/dev-test-routes.js +54 -60
  203. package/dist/testing/dev-vitest-manager.js +33 -84
  204. package/dist/testing/faker-mappings.js +3 -4
  205. package/dist/testing/fixture-generator.d.ts +2 -1
  206. package/dist/testing/fixture-generator.d.ts.map +1 -1
  207. package/dist/testing/fixture-generator.js +159 -321
  208. package/dist/testing/fixture-loader.js +2 -2
  209. package/dist/testing/fixture-manager.d.ts.map +1 -1
  210. package/dist/testing/fixture-manager.js +124 -227
  211. package/dist/testing/global-setup.d.ts.map +1 -1
  212. package/dist/testing/global-setup.js +29 -17
  213. package/dist/testing/index.js +1 -2
  214. package/dist/testing/naite-vitest-reporter.js +2 -3
  215. package/dist/testing/parallel-db-manager.js +5 -3
  216. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  217. package/dist/testing/vitest-helpers.js +15 -12
  218. package/dist/types/types.d.ts +14 -14
  219. package/dist/types/types.js +27 -50
  220. package/dist/ui/ai-api.js +6 -11
  221. package/dist/ui/ai-client.js +86 -134
  222. package/dist/ui/api.js +99 -195
  223. package/dist/ui/cdd-service.js +78 -130
  224. package/dist/ui/cdd-types.js +1 -1
  225. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  226. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  227. package/dist/ui-web/index.html +2 -2
  228. package/dist/utils/async-utils.js +13 -25
  229. package/dist/utils/class-name.js +3 -4
  230. package/dist/utils/console-util.js +11 -26
  231. package/dist/utils/controller.d.ts.map +1 -1
  232. package/dist/utils/controller.js +14 -12
  233. package/dist/utils/esm-utils.js +5 -8
  234. package/dist/utils/formatter.js +10 -22
  235. package/dist/utils/fs-utils.js +14 -25
  236. package/dist/utils/lodash-able.js +3 -4
  237. package/dist/utils/model.js +7 -14
  238. package/dist/utils/object-utils.js +41 -73
  239. package/dist/utils/path-utils.js +5 -9
  240. package/dist/utils/process-utils.js +4 -7
  241. package/dist/utils/sql-parser.js +6 -13
  242. package/dist/utils/type-utils.js +16 -26
  243. package/dist/utils/utils.js +18 -40
  244. package/dist/utils/zod-error.js +9 -16
  245. package/dist/vector/chunking.js +24 -37
  246. package/dist/vector/config.js +2 -2
  247. package/dist/vector/embedding.js +8 -19
  248. package/dist/vector/index.js +1 -2
  249. package/dist/vector/types.js +1 -1
  250. package/package.json +7 -7
  251. package/src/__tests__/env.test.ts +127 -0
  252. package/src/api/__tests__/config.test.ts +10 -1
  253. package/src/api/config.ts +4 -12
  254. package/src/api/sonamu.ts +14 -4
  255. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  256. package/src/bin/__tests__/test-command.test.ts +82 -1
  257. package/src/bin/cli.ts +9 -18
  258. package/src/bin/fixture.ts +5 -4
  259. package/src/bin/migrate-targets.ts +7 -0
  260. package/src/bin/test-command.ts +2 -2
  261. package/src/database/__tests__/db.test.ts +175 -0
  262. package/src/database/db.ts +193 -71
  263. package/src/dict/en.ts +2 -0
  264. package/src/dict/ko.ts +2 -0
  265. package/src/env.ts +123 -0
  266. package/src/migration/__tests__/migrator.test.ts +149 -0
  267. package/src/migration/migrator.ts +74 -17
  268. package/src/migration/slack-confirm.ts +21 -0
  269. package/src/skills/sonamu/database.md +1 -1
  270. package/src/skills/sonamu/entity-basic.md +31 -0
  271. package/src/skills/sonamu/puri.md +22 -0
  272. package/src/skills/sonamu/testing-devrunner.md +1 -1
  273. package/src/skills/sonamu/upsert.md +53 -6
  274. package/src/stream/ws-telemetry-memory.ts +2 -2
  275. package/src/testing/fixture-generator.ts +2 -1
  276. package/src/testing/fixture-manager.ts +3 -4
  277. package/src/testing/global-setup.ts +42 -18
  278. package/src/testing/vitest-helpers.ts +14 -0
  279. package/src/utils/controller.ts +14 -7
  280. package/tsdown.api.config.ts +6 -0
  281. package/dist/_virtual/rolldown_runtime.js +0 -39
  282. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
package/dist/ui/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { createKnexInstance, init_knex } from "../database/knex.js";
3
3
  import { DB, init_db } from "../database/db.js";
4
4
  import { SD, init_sd } from "../dict/sd.js";
@@ -18,10 +18,9 @@ import { init_ai_api, setAiApi } from "./ai-api.js";
18
18
  import { addRule, editContent, getAcList, getCddTree, init_cdd_service, listRules, openSourceFile, readContent, readRule } from "./cdd-service.js";
19
19
  import inflection from "inflection";
20
20
  import { range } from "radashi";
21
+ import fs from "fs";
21
22
  import path from "path";
22
23
  import { execSync } from "child_process";
23
- import fs from "fs";
24
-
25
24
  //#region src/ui/api.ts
26
25
  async function sonamuUIApiPlugin(fastify) {
27
26
  fastify.register(async (server) => {
@@ -48,7 +47,7 @@ async function sonamuUIApiPlugin(fastify) {
48
47
  });
49
48
  server.get("/api/tools/openVscode", async (request) => {
50
49
  const { entityId, preset, absPath } = request.query;
51
- const targetPath = (() => {
50
+ execSync(`code ${(() => {
52
51
  if (entityId && preset) {
53
52
  const entity = EntityManager.get(entityId);
54
53
  const { names } = entity;
@@ -62,17 +61,14 @@ async function sonamuUIApiPlugin(fastify) {
62
61
  })();
63
62
  return `${apiRootPath}/src/application/${entity.names.parentFs}/${filename}`;
64
63
  } else {
65
- if (!absPath) {
66
- throw new BadRequestException(SD("sonamu.error.presetOrAbsPathRequired"));
67
- }
64
+ if (!absPath) throw new BadRequestException(SD("sonamu.error.presetOrAbsPathRequired"));
68
65
  return absPath;
69
66
  }
70
- })();
71
- execSync(`code ${targetPath}`);
67
+ })()}`);
72
68
  });
73
69
  server.get("/api/tools/getSuggestion", async (request) => {
74
70
  const { origin, entityId } = request.query;
75
- const glossary = new Map([
71
+ const glossary = /* @__PURE__ */ new Map([
76
72
  ["status", "상태"],
77
73
  ["type", "타입"],
78
74
  ["image", "이미지"],
@@ -120,22 +116,18 @@ async function sonamuUIApiPlugin(fastify) {
120
116
  ["expected", "예상"],
121
117
  ["actual", "실제"]
122
118
  ]);
123
- for (const entityId$1 of EntityManager.getAllIds()) {
124
- const entity = EntityManager.get(entityId$1);
119
+ for (const entityId of EntityManager.getAllIds()) {
120
+ const entity = EntityManager.get(entityId);
125
121
  if ((entity.title ?? "") !== "") {
126
122
  glossary.set(inflection.underscore(entity.id), entity.title);
127
123
  glossary.set(inflection.underscore(inflection.pluralize(entity.id)), `${entity.title}리스트`);
128
124
  }
129
125
  entity.props.forEach((prop) => {
130
- if (glossary.has(prop.name)) {
131
- return;
132
- }
133
- if (prop.desc) {
134
- glossary.set(prop.name, prop.desc.replace(entity.title ?? "", "{EntityID}"));
135
- }
126
+ if (glossary.has(prop.name)) return;
127
+ if (prop.desc) glossary.set(prop.name, prop.desc.replace(entity.title ?? "", "{EntityID}"));
136
128
  });
137
129
  }
138
- const suggested = (() => {
130
+ return { suggested: (() => {
139
131
  const words = origin.split("_");
140
132
  const combinations = [...range(words.length, 0, -1)].flatMap((len) => {
141
133
  return [...range(0, words.length - len + 1, (idx) => {
@@ -149,19 +141,13 @@ async function sonamuUIApiPlugin(fastify) {
149
141
  let remainArr = [...words];
150
142
  for (const comb of combinations) {
151
143
  const remainStr = remainArr.join("_");
152
- if (remainStr.includes(comb.w) && glossary.has(comb.w)) {
153
- remainArr = remainStr.replace(comb.w, REPLACED_PREFIX + glossary.get(comb.w)).split("_");
154
- }
144
+ if (remainStr.includes(comb.w) && glossary.has(comb.w)) remainArr = remainStr.replace(comb.w, REPLACED_PREFIX + glossary.get(comb.w)).split("_");
155
145
  }
156
146
  return remainArr.map((r) => {
157
- if (r.startsWith(REPLACED_PREFIX)) {
158
- return r.replace(REPLACED_PREFIX, "");
159
- } else {
160
- return r.toUpperCase();
161
- }
147
+ if (r.startsWith(REPLACED_PREFIX)) return r.replace(REPLACED_PREFIX, "");
148
+ else return r.toUpperCase();
162
149
  }).join("").replace(/{EntityID}/g, entityId ? EntityManager.get(entityId).title : "");
163
- })();
164
- return { suggested };
150
+ })() };
165
151
  });
166
152
  server.get("/api/entity/findMany", async () => {
167
153
  const entityIds = EntityManager.getAllIds();
@@ -186,8 +172,8 @@ async function sonamuUIApiPlugin(fastify) {
186
172
  if (aId < bId) return -1;
187
173
  if (aId > bId) return 1;
188
174
  if (aId === bId) {
189
- if (a.parentId === undefined) return -1;
190
- if (b.parentId === undefined) return 1;
175
+ if (a.parentId === void 0) return -1;
176
+ if (b.parentId === void 0) return 1;
191
177
  return 0;
192
178
  }
193
179
  return 0;
@@ -196,27 +182,18 @@ async function sonamuUIApiPlugin(fastify) {
196
182
  });
197
183
  server.get("/api/entity/typeIds", async (request) => {
198
184
  const { filter, reload } = request.query;
199
- if (reload === "1") {
200
- await Sonamu.syncer.autoloadTypes();
201
- }
202
- const typeIds = (() => {
185
+ if (reload === "1") await Sonamu.syncer.autoloadTypes();
186
+ return { typeIds: (() => {
203
187
  const projectTypeIds = Object.entries(Sonamu.syncer.types).filter(([_typeId, zodType]) => zodType._zod.def.type !== "enum").map(([typeId, _zodType]) => typeId);
204
- const builtInTypeIds = [...BUILT_IN_TYPE_IDS];
205
- const allTypeIds = [...builtInTypeIds, ...projectTypeIds];
206
- if (filter === "types") {
207
- return allTypeIds;
208
- }
188
+ const allTypeIds = [...[...BUILT_IN_TYPE_IDS], ...projectTypeIds];
189
+ if (filter === "types") return allTypeIds;
209
190
  const enumIds = EntityManager.getAllIds().flatMap((entityId) => {
210
191
  const entity = EntityManager.get(entityId);
211
192
  return Object.keys(entity.enumLabels);
212
193
  });
213
- if (filter === "enums") {
214
- return enumIds;
215
- } else {
216
- return [...allTypeIds, ...enumIds];
217
- }
218
- })();
219
- return { typeIds };
194
+ if (filter === "enums") return enumIds;
195
+ else return [...allTypeIds, ...enumIds];
196
+ })() };
220
197
  });
221
198
  server.post("/api/entity/create", async (request) => {
222
199
  return await waitForHMRCompleted(async () => {
@@ -250,13 +227,8 @@ async function sonamuUIApiPlugin(fastify) {
250
227
  const { entityId, subsetKey, fields, fieldsInternal } = request.body;
251
228
  const entity = EntityManager.get(entityId);
252
229
  entity.subsets[subsetKey] = fields;
253
- if (fieldsInternal !== undefined) {
254
- if (fieldsInternal.length > 0) {
255
- entity.subsetsInternal[subsetKey] = fieldsInternal;
256
- } else {
257
- delete entity.subsetsInternal[subsetKey];
258
- }
259
- }
230
+ if (fieldsInternal !== void 0) if (fieldsInternal.length > 0) entity.subsetsInternal[subsetKey] = fieldsInternal;
231
+ else delete entity.subsetsInternal[subsetKey];
260
232
  await entity.save();
261
233
  return {
262
234
  updated: fields,
@@ -277,32 +249,28 @@ async function sonamuUIApiPlugin(fastify) {
277
249
  server.post("/api/entity/createProp", async (request) => {
278
250
  return await waitForHMRCompleted(async () => {
279
251
  const { entityId, at, newProp } = request.body;
280
- const entity = EntityManager.get(entityId);
281
- await entity.createProp(newProp, at);
252
+ await EntityManager.get(entityId).createProp(newProp, at);
282
253
  return true;
283
254
  });
284
255
  });
285
256
  server.post("/api/entity/modifyProp", async (request) => {
286
257
  return await waitForHMRCompleted(async () => {
287
258
  const { entityId, at, newProp } = request.body;
288
- const entity = EntityManager.get(entityId);
289
- entity.modifyProp(newProp, at);
259
+ EntityManager.get(entityId).modifyProp(newProp, at);
290
260
  return true;
291
261
  });
292
262
  });
293
263
  server.post("/api/entity/delProp", async (request) => {
294
264
  return await waitForHMRCompleted(async () => {
295
265
  const { entityId, at } = request.body;
296
- const entity = EntityManager.get(entityId);
297
- entity.delProp(at);
266
+ EntityManager.get(entityId).delProp(at);
298
267
  return true;
299
268
  });
300
269
  });
301
270
  server.post("/api/entity/moveProp", async (request) => {
302
271
  return await waitForHMRCompleted(async () => {
303
272
  const { entityId, at, to } = request.body;
304
- const entity = EntityManager.get(entityId);
305
- entity.moveProp(at, to);
273
+ EntityManager.get(entityId).moveProp(at, to);
306
274
  return true;
307
275
  });
308
276
  });
@@ -328,9 +296,7 @@ async function sonamuUIApiPlugin(fastify) {
328
296
  return await waitForHMRCompleted(async () => {
329
297
  const { entityId, newEnumId } = request.body;
330
298
  const entity = EntityManager.get(entityId);
331
- if (entity.enumLabels[newEnumId]) {
332
- throw new Error(`이미 존재하는 enumId입니다: ${newEnumId}`);
333
- }
299
+ if (entity.enumLabels[newEnumId]) throw new Error(`이미 존재하는 enumId입니다: ${newEnumId}`);
334
300
  entity.enumLabels[newEnumId] = newEnumId.endsWith("Status") ? {
335
301
  active: "노출",
336
302
  hidden: "숨김"
@@ -343,36 +309,25 @@ async function sonamuUIApiPlugin(fastify) {
343
309
  return await waitForHMRCompleted(async () => {
344
310
  const { entityId, enumId } = request.body;
345
311
  const entityIds = EntityManager.getAllIds();
346
- const isExists = entityIds.some((entityId$1) => {
347
- const entity$1 = EntityManager.get(entityId$1);
348
- return Object.keys(entity$1.enumLabels).includes(enumId.after);
349
- });
350
- if (isExists) {
351
- throw new Error(`이미 존재하는 EnumId입니다: ${enumId.after}`);
352
- }
312
+ if (entityIds.some((entityId) => {
313
+ const entity = EntityManager.get(entityId);
314
+ return Object.keys(entity.enumLabels).includes(enumId.after);
315
+ })) throw new Error(`이미 존재하는 EnumId입니다: ${enumId.after}`);
353
316
  const entity = EntityManager.get(entityId);
354
317
  entity.enumLabels[enumId.after] = entity.enumLabels[enumId.before];
355
318
  delete entity.enumLabels[enumId.before];
356
319
  await entity.save();
357
- for (const entityId$1 of entityIds) {
358
- const entity$1 = EntityManager.get(entityId$1);
359
- for (const prop of entity$1.props) {
360
- if (prop.type === "enum" && prop.id === enumId.before) {
361
- prop.id = enumId.after;
362
- }
363
- }
364
- await entity$1.save();
320
+ for (const entityId of entityIds) {
321
+ const entity = EntityManager.get(entityId);
322
+ for (const prop of entity.props) if (prop.type === "enum" && prop.id === enumId.before) prop.id = enumId.after;
323
+ await entity.save();
365
324
  }
366
325
  });
367
326
  });
368
327
  server.post("/api/entity/deleteEnumId", async (request) => {
369
328
  return await waitForHMRCompleted(async () => {
370
329
  const { entityId, enumId } = request.body;
371
- const entityIds = EntityManager.getAllIds();
372
- const isReferenced = entityIds.flatMap((entityId$1) => EntityManager.get(entityId$1).props).some((prop) => prop.type === "enum" && prop.id === enumId);
373
- if (isReferenced) {
374
- throw new Error(`${enumId}를 참조하는 프로퍼티가 존재합니다.`);
375
- }
330
+ if (EntityManager.getAllIds().flatMap((entityId) => EntityManager.get(entityId).props).some((prop) => prop.type === "enum" && prop.id === enumId)) throw new Error(`${enumId}를 참조하는 프로퍼티가 존재합니다.`);
376
331
  const entity = EntityManager.get(entityId);
377
332
  delete entity.enumLabels[enumId];
378
333
  await entity.save();
@@ -382,18 +337,12 @@ async function sonamuUIApiPlugin(fastify) {
382
337
  return await waitForHMRCompleted(async () => {
383
338
  const { entityId, target, propName, enumId, subsetKey, cone } = request.body;
384
339
  const entity = EntityManager.get(entityId);
385
- if (target === "entity") {
386
- entity.cone = cone;
387
- } else if (target === "prop" && propName) {
340
+ if (target === "entity") entity.cone = cone;
341
+ else if (target === "prop" && propName) {
388
342
  const prop = entity.props.find((p) => p.name === propName);
389
- if (prop) {
390
- prop.cone = cone;
391
- }
392
- } else if (target === "enum" && enumId) {
393
- entity.enumCones[enumId] = cone;
394
- } else if (target === "subset" && subsetKey) {
395
- entity.subsetCones[subsetKey] = cone;
396
- }
343
+ if (prop) prop.cone = cone;
344
+ } else if (target === "enum" && enumId) entity.enumCones[enumId] = cone;
345
+ else if (target === "subset" && subsetKey) entity.subsetCones[subsetKey] = cone;
397
346
  await entity.save();
398
347
  return true;
399
348
  });
@@ -404,12 +353,11 @@ async function sonamuUIApiPlugin(fastify) {
404
353
  try {
405
354
  const entity = EntityManager.get(entityId);
406
355
  const effectiveLocale = locale ?? Sonamu.config.i18n.defaultLocale;
407
- const result = await entity.generateCones({
356
+ return await entity.generateCones({
408
357
  preserveExisting: preserveExisting ?? true,
409
358
  onlyEmpty: onlyEmpty ?? false,
410
359
  locale: effectiveLocale
411
360
  });
412
- return result;
413
361
  } catch (error) {
414
362
  const message = error instanceof Error ? error.message : String(error);
415
363
  if (message.includes("존재하지 않는 Entity")) {
@@ -443,19 +391,14 @@ async function sonamuUIApiPlugin(fastify) {
443
391
  });
444
392
  server.get("/api/entity/getTableColumns", async (request) => {
445
393
  const { entityId } = request.query;
446
- const entity = EntityManager.get(entityId);
447
- const columns = entity.getTableColumns();
448
- return { columns };
394
+ return { columns: EntityManager.get(entityId).getTableColumns() };
449
395
  });
450
396
  server.get("/api/migrations/status", async () => {
451
- const status = await migrator.getStatus();
452
- return { status };
397
+ return { status: await migrator.getStatus() };
453
398
  });
454
399
  server.post("/api/migrations/runAction", async (request) => {
455
400
  const { action, targets, force, forceReason, requestor } = request.body;
456
- if (action === "shadow") {
457
- return migrator.runShadowTest();
458
- }
401
+ if (action === "shadow") return migrator.runShadowTest();
459
402
  if (action === "apply") {
460
403
  const slackConfirm = new SlackConfirm();
461
404
  const requiresApproval = targets.some((t) => slackConfirm.isTargetRequiresApproval(t));
@@ -466,8 +409,7 @@ async function sonamuUIApiPlugin(fastify) {
466
409
  "::1"
467
410
  ];
468
411
  const isLocalTarget = targets.every((target) => {
469
- const targetConfig = Sonamu.dbConfig[target];
470
- const host = (targetConfig?.connection)?.host ?? "localhost";
412
+ const host = (Sonamu.dbConfig[target]?.connection)?.host ?? "localhost";
471
413
  return localHosts.includes(host.toLowerCase());
472
414
  });
473
415
  if (requiresApproval && slackConfirm.isConfigured() && !isLocalTarget) {
@@ -479,26 +421,19 @@ async function sonamuUIApiPlugin(fastify) {
479
421
  const { approved, rejected } = await slackConfirm.checkApproval(existing.channel, existing.ts);
480
422
  if (approved) {
481
423
  const result = await migrator.runAction(action, targets);
482
- if (result.length > 0) {
483
- await slackConfirm.logExecution(existing.channel, existing.ts, result, requestor);
484
- }
424
+ if (result.length > 0) await slackConfirm.logExecution(existing.channel, existing.ts, result, requestor);
485
425
  return result;
486
- } else if (rejected) {
487
- throw new BadRequestException(SD("sonamu.error.migrationRejected"));
488
- } else if (force) {
426
+ } else if (rejected) throw new BadRequestException(SD("sonamu.error.migrationRejected"));
427
+ else if (force) {
489
428
  await slackConfirm.forceApproval(existing.channel, existing.ts, forceReason ?? "사유 없음", requestor);
490
429
  const result = await migrator.runAction(action, targets);
491
- if (result.length > 0) {
492
- await slackConfirm.logExecution(existing.channel, existing.ts, result, requestor);
493
- }
430
+ if (result.length > 0) await slackConfirm.logExecution(existing.channel, existing.ts, result, requestor);
494
431
  return result;
495
- } else {
496
- return {
497
- type: "pending",
498
- channel: existing.channel,
499
- ts: existing.ts
500
- };
501
- }
432
+ } else return {
433
+ type: "pending",
434
+ channel: existing.channel,
435
+ ts: existing.ts
436
+ };
502
437
  } else {
503
438
  const { channel, ts } = await slackConfirm.postApprovalRequest(pendingMigrations, targets, requestor);
504
439
  await slackConfirm.saveRequest(pendingMigrations, channel, ts);
@@ -516,20 +451,16 @@ async function sonamuUIApiPlugin(fastify) {
516
451
  server.post("/api/migrations/checkApproval", async (request) => {
517
452
  const { channel, ts } = request.body;
518
453
  const slackConfirm = new SlackConfirm();
519
- if (!slackConfirm.isConfigured()) {
520
- return {
521
- approved: true,
522
- rejected: false
523
- };
524
- }
454
+ if (!slackConfirm.isConfigured()) return {
455
+ approved: true,
456
+ rejected: false
457
+ };
525
458
  return slackConfirm.checkApproval(channel, ts);
526
459
  });
527
460
  server.post("/api/migrations/forceApproval", async (request) => {
528
461
  const { channel, ts, reason, requestor } = request.body;
529
462
  const slackConfirm = new SlackConfirm();
530
- if (!slackConfirm.isConfigured()) {
531
- throw new BadRequestException(SD("sonamu.error.slackConfirmNotConfigured"));
532
- }
463
+ if (!slackConfirm.isConfigured()) throw new BadRequestException(SD("sonamu.error.slackConfirmNotConfigured"));
533
464
  await slackConfirm.forceApproval(channel, ts, reason, requestor);
534
465
  return { success: true };
535
466
  });
@@ -542,17 +473,14 @@ async function sonamuUIApiPlugin(fastify) {
542
473
  });
543
474
  server.post("/api/scaffolding/getStatus", async (request) => {
544
475
  const { entityIds, templateKeys: _templateKeys } = request.body;
545
- if ((entityIds ?? []).length === 0) {
546
- throw new BadRequestException(SD("sonamu.error.entityIdsRequired"));
547
- } else if ((_templateKeys ?? []).length === 0) {
548
- throw new BadRequestException(SD("sonamu.error.templateKeysRequired"));
549
- }
476
+ if ((entityIds ?? []).length === 0) throw new BadRequestException(SD("sonamu.error.entityIdsRequired"));
477
+ else if ((_templateKeys ?? []).length === 0) throw new BadRequestException(SD("sonamu.error.templateKeysRequired"));
550
478
  entityIds.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
551
479
  const templateKeys = TemplateKey.options.filter((tk) => _templateKeys.includes(tk));
552
480
  const combinations = entityIds.flatMap((entityId) => {
553
481
  return templateKeys.map((templateKey) => [entityId, templateKey]);
554
482
  });
555
- const statuses = await Promise.all(combinations.map(async ([entityId, templateKey]) => {
483
+ return { statuses: await Promise.all(combinations.map(async ([entityId, templateKey]) => {
556
484
  const { subPath, fullPath, isExists } = await Sonamu.syncer.checkExistsGenCode(entityId, templateKey);
557
485
  return {
558
486
  entityId,
@@ -561,17 +489,13 @@ async function sonamuUIApiPlugin(fastify) {
561
489
  fullPath,
562
490
  isExists
563
491
  };
564
- }));
565
- return { statuses };
492
+ })) };
566
493
  });
567
494
  server.post("/api/scaffolding/generate", async (request) => {
568
495
  const { options } = request.body;
569
- if (options.length === 0) {
570
- throw new BadRequestException(SD("sonamu.error.optionsRequired"));
571
- }
496
+ if (options.length === 0) throw new BadRequestException(SD("sonamu.error.optionsRequired"));
572
497
  const keys = options.flatMap(({ templateKey }) => {
573
- const template = TemplateManager.get(templateKey);
574
- return template.getRequiredDictKeys() ?? [];
498
+ return TemplateManager.get(templateKey).getRequiredDictKeys() ?? [];
575
499
  });
576
500
  await sonamuDictionary.ensureDictKeys([...new Set(keys)]);
577
501
  const result = await Promise.all(options.map(async ({ entityId, templateKey, enumId, overwrite }) => {
@@ -581,25 +505,21 @@ async function sonamuUIApiPlugin(fastify) {
581
505
  enumId
582
506
  }, { overwrite });
583
507
  } catch (e) {
584
- if (isSoException(e) && e.statusCode === 541) {
585
- return null;
586
- } else {
508
+ if (isSoException(e) && e.statusCode === 541) return null;
509
+ else {
587
510
  console.error(e);
588
511
  throw e;
589
512
  }
590
513
  }
591
514
  }));
592
- if (result.filter(nonNullable).length === 0) {
593
- throw new ServiceUnavailableException(SD("sonamu.error.allFilesGenerated"));
594
- }
515
+ if (result.filter(nonNullable).length === 0) throw new ServiceUnavailableException(SD("sonamu.error.allFilesGenerated"));
595
516
  return result;
596
517
  });
597
518
  server.post("/api/scaffolding/preview", async (request) => {
598
519
  const { option } = request.body;
599
520
  try {
600
521
  const { templateKey, ...templateOptions } = option;
601
- const pathAndCodes = await Sonamu.syncer.renderTemplate(templateKey, templateOptions);
602
- return { pathAndCodes };
522
+ return { pathAndCodes: await Sonamu.syncer.renderTemplate(templateKey, templateOptions) };
603
523
  } catch (e) {
604
524
  console.error(e);
605
525
  throw e;
@@ -626,9 +546,7 @@ async function sonamuUIApiPlugin(fastify) {
626
546
  });
627
547
  server.post("/api/i18n/import", async (request) => {
628
548
  const data = await request.file();
629
- if (!data) {
630
- throw new BadRequestException(SD("sonamu.error.fileNotUploaded"));
631
- }
549
+ if (!data) throw new BadRequestException(SD("sonamu.error.fileNotUploaded"));
632
550
  const buffer = await data.toBuffer();
633
551
  return sonamuDictionary.importFromExcel(buffer);
634
552
  });
@@ -656,49 +574,42 @@ async function sonamuUIApiPlugin(fastify) {
656
574
  }
657
575
  });
658
576
  server.get("/api/tasks/workflowDefinitions", async () => {
659
- const definitions = Sonamu.workflows.workflowDefinitions;
660
- return { definitions };
577
+ return { definitions: Sonamu.workflows.workflowDefinitions };
661
578
  });
662
579
  server.get("/api/tasks/workflowRuns", async (request) => {
663
580
  const backend = Sonamu.workflows.backend;
664
581
  const { limit, after, before, order, status, workflowName, createdAfter, createdBefore } = request.query;
665
582
  return backend.listWorkflowRuns({
666
- limit: limit ? Number.parseInt(limit, 10) : undefined,
583
+ limit: limit ? Number.parseInt(limit, 10) : void 0,
667
584
  after,
668
585
  before,
669
586
  order,
670
- status: status ? status.split(",") : undefined,
671
- workflowName: workflowName || undefined,
672
- createdAfter: createdAfter ? new Date(createdAfter) : undefined,
673
- createdBefore: createdBefore ? new Date(createdBefore) : undefined
587
+ status: status ? status.split(",") : void 0,
588
+ workflowName: workflowName || void 0,
589
+ createdAfter: createdAfter ? new Date(createdAfter) : void 0,
590
+ createdBefore: createdBefore ? new Date(createdBefore) : void 0
674
591
  });
675
592
  });
676
593
  server.get("/api/tasks/workflowRuns/:id", async (request) => {
677
- const backend = Sonamu.workflows.backend;
678
- const workflowRun = await backend.getWorkflowRun({ workflowRunId: request.params.id });
679
- if (!workflowRun) {
680
- throw new Error(`Workflow run not found: ${request.params.id}`);
681
- }
594
+ const workflowRun = await Sonamu.workflows.backend.getWorkflowRun({ workflowRunId: request.params.id });
595
+ if (!workflowRun) throw new Error(`Workflow run not found: ${request.params.id}`);
682
596
  return workflowRun;
683
597
  });
684
598
  server.post("/api/tasks/workflowRuns/:id/cancel", async (request) => {
685
- const backend = Sonamu.workflows.backend;
686
- return backend.cancelWorkflowRun({ workflowRunId: request.params.id });
599
+ return Sonamu.workflows.backend.cancelWorkflowRun({ workflowRunId: request.params.id });
687
600
  });
688
601
  server.post("/api/tasks/workflowRuns/:id/pause", async (request) => {
689
- const backend = Sonamu.workflows.backend;
690
- return backend.pauseWorkflowRun({ workflowRunId: request.params.id });
602
+ return Sonamu.workflows.backend.pauseWorkflowRun({ workflowRunId: request.params.id });
691
603
  });
692
604
  server.post("/api/tasks/workflowRuns/:id/resume", async (request) => {
693
- const backend = Sonamu.workflows.backend;
694
- return backend.resumeWorkflowRun({ workflowRunId: request.params.id });
605
+ return Sonamu.workflows.backend.resumeWorkflowRun({ workflowRunId: request.params.id });
695
606
  });
696
607
  server.get("/api/tasks/workflowRuns/:id/steps", async (request) => {
697
608
  const backend = Sonamu.workflows.backend;
698
609
  const { limit, after, before } = request.query;
699
610
  return backend.listStepAttempts({
700
611
  workflowRunId: request.params.id,
701
- limit: limit ? Number.parseInt(limit, 10) : undefined,
612
+ limit: limit ? Number.parseInt(limit, 10) : void 0,
702
613
  after,
703
614
  before
704
615
  });
@@ -714,7 +625,7 @@ async function sonamuUIApiPlugin(fastify) {
714
625
  ok: true,
715
626
  project: process.cwd().split("/").pop() || "unknown",
716
627
  port,
717
- timestamp: new Date().toISOString()
628
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
718
629
  };
719
630
  });
720
631
  /**
@@ -722,11 +633,9 @@ async function sonamuUIApiPlugin(fastify) {
722
633
  */
723
634
  server.post("/api/sonamu/fixture/generate", async (request, reply) => {
724
635
  const { entity, count = 1, overrides, targetDb = "fixture" } = request.body;
725
- const dbConfig = targetDb === "fixture" ? Sonamu.dbConfig.fixture : Sonamu.dbConfig.test;
726
- const db = createKnexInstance(dbConfig);
636
+ const db = createKnexInstance(targetDb === "fixture" ? Sonamu.dbConfig.fixture : Sonamu.dbConfig.test);
727
637
  try {
728
- const generator = new FixtureGenerator(db, db, targetDb, EntityManager);
729
- const fixtures = await generator.generateBatch([{
638
+ const fixtures = await new FixtureGenerator(db, db, targetDb, EntityManager).generateBatch([{
730
639
  entity,
731
640
  count,
732
641
  overrides: overrides ?? {}
@@ -756,8 +665,7 @@ async function sonamuUIApiPlugin(fastify) {
756
665
  const fixtureDbConfig = Sonamu.dbConfig.fixture;
757
666
  const fixtureDb = createKnexInstance(fixtureDbConfig);
758
667
  try {
759
- const explorer = new DataExplorer(fixtureDb, EntityManager);
760
- const data = await explorer.explore(entity, {
668
+ const data = await new DataExplorer(fixtureDb, EntityManager).explore(entity, {
761
669
  strategy,
762
670
  limit,
763
671
  where
@@ -788,8 +696,7 @@ async function sonamuUIApiPlugin(fastify) {
788
696
  const sourceDb = DB.getDB("r");
789
697
  const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
790
698
  try {
791
- const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
792
- const results = await generator.importFromSource(entity, {
699
+ const results = await new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager).importFromSource(entity, {
793
700
  strategy,
794
701
  limit,
795
702
  includeRelations,
@@ -820,10 +727,8 @@ async function sonamuUIApiPlugin(fastify) {
820
727
  const { entities } = request.body;
821
728
  const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
822
729
  try {
823
- const targetEntities = entities && entities.length > 0 ? entities : EntityManager.getAllIds();
824
- const tableNames = targetEntities.map((entityId) => {
825
- const entity = EntityManager.get(entityId);
826
- return entity.table;
730
+ const tableNames = (entities && entities.length > 0 ? entities : EntityManager.getAllIds()).map((entityId) => {
731
+ return EntityManager.get(entityId).table;
827
732
  });
828
733
  await fixtureDb.raw(`TRUNCATE TABLE ${tableNames.map((t) => `"${t}"`).join(", ")} RESTART IDENTITY CASCADE`);
829
734
  return {
@@ -882,7 +787,8 @@ async function sonamuUIApiPlugin(fastify) {
882
787
  });
883
788
  }, { prefix: "/sonamu-ui" });
884
789
  }
885
- var init_api = __esmMin((() => {
790
+ //#endregion
791
+ __esmMin((() => {
886
792
  init_sonamu();
887
793
  init_db();
888
794
  init_knex();
@@ -900,9 +806,7 @@ var init_api = __esmMin((() => {
900
806
  init_utils();
901
807
  init_ai_api();
902
808
  init_cdd_service();
903
- }));
904
-
905
- //#endregion
906
- init_api();
809
+ }))();
907
810
  export { sonamuUIApiPlugin };
908
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwibmFtZXMiOlsiZW50aXR5SWQiLCJyZW1haW5BcnI6IHN0cmluZ1tdIiwiZW50aXR5IiwiZXJyb3I6IHVua25vd24iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdWkvYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeUluc3RhbmNlIH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyByYW5nZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgY3JlYXRlS25leEluc3RhbmNlIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2tuZXhcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IHNvbmFtdURpY3Rpb25hcnkgfSBmcm9tIFwiLi4vZGljdC9zb25hbXUtZGljdGlvbmFyeVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIGlzU29FeGNlcHRpb24sXG4gIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHsgdHlwZSBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0IH0gZnJvbSBcIi4uL21pZ3JhdGlvbi9zbGFjay1jb25maXJtXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgRml4dHVyZUdlbmVyYXRvciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBEdXBsaWNhdGVDaGVja09wdGlvbnMgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1RZUEVfSURTLCBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgRmxhdHRlblN1YnNldFJvdyxcbiAgdHlwZSBQYXRoQW5kQ29kZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgc2V0QWlBcGkgfSBmcm9tIFwiLi9haS1hcGlcIjtcbmltcG9ydCB7IHR5cGUgQ2RkQWRkUnVsZVJlcXVlc3QgfSBmcm9tIFwiLi9jZGQtc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgYWRkUnVsZSxcbiAgZWRpdENvbnRlbnQsXG4gIGdldEFjTGlzdCxcbiAgZ2V0Q2RkVHJlZSxcbiAgbGlzdFJ1bGVzLFxuICBvcGVuU291cmNlRmlsZSxcbiAgcmVhZENvbnRlbnQsXG4gIHJlYWRSdWxlLFxufSBmcm9tIFwiLi9jZGQtc2VydmljZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29uYW11VUlBcGlQbHVnaW4oZmFzdGlmeTogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGZhc3RpZnkucmVnaXN0ZXIoXG4gICAgYXN5bmMgKHNlcnZlcikgPT4ge1xuICAgICAgLy8gbWlncmF0b3JcbiAgICAgIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgICAgIC8vIHdhaXRGb3JITVJDb21wbGV0ZWRcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JITVJDb21wbGV0ZWQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3Qgd2FpdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIFNvbmFtdS5zeW5jZXIuZXZlbnRFbWl0dGVyLm9mZihcIm9uSE1SQ29tcGxldGVkXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIDE1MDApO1xuXG4gICAgICAgICAgU29uYW11LnN5bmNlci5ldmVudEVtaXR0ZXIub25jZShcIm9uSE1SQ29tcGxldGVkXCIsIGhhbmRsZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbigpO1xuICAgICAgICBhd2FpdCB3YWl0UHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2V0QWlBcGkoc2VydmVyKTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvc29uYW11L2NvbmZpZ1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBTb25hbXUuY29uZmlnO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGVudGl0eUlkPzogc3RyaW5nO1xuICAgICAgICAgIHByZXNldD86IFwidHlwZXNcIiB8IFwiZW50aXR5Lmpzb25cIiB8IFwiZ2VuZXJhdGVkXCI7XG4gICAgICAgICAgYWJzUGF0aD86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90b29scy9vcGVuVnNjb2RlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHByZXNldCwgYWJzUGF0aCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICBjb25zdCB0YXJnZXRQYXRoID0gKCgpID0+IHtcbiAgICAgICAgICBpZiAoZW50aXR5SWQgJiYgcHJlc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWVzIH0gPSBlbnRpdHk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgYXBpUm9vdFBhdGggfSA9IFNvbmFtdTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidHlwZXNcIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30udHlwZXMudHNgO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnRpdHkuanNvblwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWVzLmZzfS5lbnRpdHkuanNvbmA7XG4gICAgICAgICAgICAgICAgY2FzZSBcImdlbmVyYXRlZFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWVzLmZzfS5nZW5lcmF0ZWQudHNgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgcmV0dXJuIGAke2FwaVJvb3RQYXRofS9zcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMucGFyZW50RnN9LyR7ZmlsZW5hbWV9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFhYnNQYXRoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnByZXNldE9yQWJzUGF0aFJlcXVpcmVkXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhYnNQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgZXhlY1N5bmMoYGNvZGUgJHt0YXJnZXRQYXRofWApO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIG9yaWdpbjogc3RyaW5nO1xuICAgICAgICAgIGVudGl0eUlkPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rvb2xzL2dldFN1Z2dlc3Rpb25cIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBvcmlnaW4sIGVudGl0eUlkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIC8vIOy5mO2ZmCDsmqnslrTsp5FcbiAgICAgICAgY29uc3QgZ2xvc3NhcnkgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gICAgICAgICAgW1wic3RhdHVzXCIsIFwi7IOB7YOcXCJdLFxuICAgICAgICAgIFtcInR5cGVcIiwgXCLtg4DsnoVcIl0sXG4gICAgICAgICAgW1wiaW1hZ2VcIiwgXCLsnbTrr7jsp4BcIl0sXG4gICAgICAgICAgW1wiaW1hZ2VzXCIsIFwi7J2066+47KeA66as7Iqk7Yq4XCJdLFxuICAgICAgICAgIFtcInVybFwiLCBcIlVSTFwiXSxcbiAgICAgICAgICBbXCJpZFwiLCBcIklEXCJdLFxuICAgICAgICAgIFtcIm5hbWVcIiwgYHtFbnRpdHlJRH3rqoVgXSxcbiAgICAgICAgICBbXCJ0aXRsZVwiLCBcIntFbnRpdHlJRH3rqoVcIl0sXG4gICAgICAgICAgW1wicGFyZW50XCIsIFwi7IOB7JyEe0VudGl0eUlEfVwiXSxcbiAgICAgICAgICBbXCJkZXNjXCIsIFwi7ISk66qFXCJdLFxuICAgICAgICAgIFtcImF0XCIsIFwi7J287IucXCJdLFxuICAgICAgICAgIFtcImNyZWF0ZWRcIiwgXCLrk7HroZ1cIl0sXG4gICAgICAgICAgW1widXBkYXRlZFwiLCBcIuyImOyglVwiXSxcbiAgICAgICAgICBbXCJkZWxldGVkXCIsIFwi7IKt7KCcXCJdLFxuICAgICAgICAgIFtcImJ5XCIsIFwi7Jyg7KCAXCJdLFxuICAgICAgICAgIFtcImRhdGVcIiwgXCLsnbzsnpBcIl0sXG4gICAgICAgICAgW1widGltZVwiLCBcIuyLnOqwhFwiXSxcbiAgICAgICAgICBbXCJrb1wiLCBcIijtlZzquIApXCJdLFxuICAgICAgICAgIFtcImVuXCIsIFwiKOyYgeusuClcIl0sXG4gICAgICAgICAgW1wia3J3XCIsIFwiKOybkClcIl0sXG4gICAgICAgICAgW1widXNkXCIsIFwiKFVTRClcIl0sXG4gICAgICAgICAgW1wiY29sb3JcIiwgXCLsu6zrn6xcIl0sXG4gICAgICAgICAgW1wiY29kZVwiLCBcIuy9lOuTnFwiXSxcbiAgICAgICAgICBbXCJ4XCIsIFwiWOyijO2RnFwiXSxcbiAgICAgICAgICBbXCJ5XCIsIFwiWeyijO2RnFwiXSxcbiAgICAgICAgICBbXCJjdXJyZW50XCIsIFwi7ZiE7J6sXCJdLFxuICAgICAgICAgIFtcInN0b2NrXCIsIFwi7J6s6rOgXCJdLFxuICAgICAgICAgIFtcInRvdGFsXCIsIFwi7LSdXCJdLFxuICAgICAgICAgIFtcImFkbWluXCIsIFwi6rSA66as7J6QXCJdLFxuICAgICAgICAgIFtcImdyb3VwXCIsIFwi6re466O5XCJdLFxuICAgICAgICAgIFtcIml0ZW1cIiwgXCLslYTsnbTthZxcIl0sXG4gICAgICAgICAgW1wiY250XCIsIFwi7IiY65+JXCJdLFxuICAgICAgICAgIFtcInByaWNlXCIsIFwi6rCA6rKpXCJdLFxuICAgICAgICAgIFtcInByZXNldFwiLCBcIu2UhOumrOyFi1wiXSxcbiAgICAgICAgICBbXCJhY2N0XCIsIFwi6rOE7KKMXCJdLFxuICAgICAgICAgIFtcInRlbFwiLCBcIuyghO2ZlOuyiO2YuFwiXSxcbiAgICAgICAgICBbXCJub1wiLCBcIuuyiO2YuFwiXSxcbiAgICAgICAgICBbXCJib2R5XCIsIFwi64K07JqpXCJdLFxuICAgICAgICAgIFtcImNvbnRlbnRcIiwgXCLrgrTsmqlcIl0sXG4gICAgICAgICAgW1wib3JkZXJub1wiLCBcIuygleugrOyInOyEnFwiXSxcbiAgICAgICAgICBbXCJwcmlvcml0eVwiLCBcIuyasOyEoOyInOychFwiXSxcbiAgICAgICAgICBbXCJ0ZXh0XCIsIFwi7YWN7Iqk7Yq4XCJdLFxuICAgICAgICAgIFtcImtleVwiLCBcIu2CpFwiXSxcbiAgICAgICAgICBbXCJzdW1cIiwgXCLtlansgrBcIl0sXG4gICAgICAgICAgW1wiZXhwZWN0ZWRcIiwgXCLsmIjsg4FcIl0sXG4gICAgICAgICAgW1wiYWN0dWFsXCIsIFwi7Iuk7KCcXCJdLFxuICAgICAgICBdKTtcbiAgICAgICAgLy8g7KCE7LK0IOyXlO2LsO2LsCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsCDtg4DsnbTti4Dqs7wg7ZSE66GtIOyEpOuqheydhCDsuZjtmZgg7Jqp7Ja07KeR7JeQIOy2lOqwgFxuICAgICAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgaWYgKChlbnRpdHkudGl0bGUgPz8gXCJcIikgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGdsb3NzYXJ5LnNldChpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZW50aXR5LmlkKSwgZW50aXR5LnRpdGxlKTtcbiAgICAgICAgICAgIGdsb3NzYXJ5LnNldChcbiAgICAgICAgICAgICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGVudGl0eS5pZCkpLFxuICAgICAgICAgICAgICBgJHtlbnRpdHkudGl0bGV966as7Iqk7Yq4YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW50aXR5LnByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmIChnbG9zc2FyeS5oYXMocHJvcC5uYW1lKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgICAgIGdsb3NzYXJ5LnNldChwcm9wLm5hbWUsIHByb3AuZGVzYy5yZXBsYWNlKGVudGl0eS50aXRsZSA/PyBcIlwiLCBcIntFbnRpdHlJRH1cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VnZ2VzdGVkID0gKCgpID0+IHtcbiAgICAgICAgICAvLyDri6jslrQg67aE66asLCDqsIDriqXtlZwg7KGw7ZWpIOyDneyEsVxuICAgICAgICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICBjb25zdCBjb21iaW5hdGlvbnMgPSBbLi4ucmFuZ2Uod29yZHMubGVuZ3RoLCAwLCAtMSldLmZsYXRNYXAoKGxlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgLi4ucmFuZ2UoMCwgd29yZHMubGVuZ3RoIC0gbGVuICsgMSwgKGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBsZW4sXG4gICAgICAgICAgICAgICAgICB3OiB3b3Jkcy5zbGljZShpZHgsIGlkeCArIGxlbikuam9pbihcIl9cIiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7KGw7ZWp7J2EIOyInO2ajO2VmOupsCwg7LmY7ZmYIOyaqeyWtOynkeyXkCDsnojripQg64uo7Ja06rCAIO2PrO2VqOuQnCDqsr3smrAsIOy5mO2ZmCDsmqnslrTroZwg7LmY7ZmYXG4gICAgICAgICAgY29uc3QgUkVQTEFDRURfUFJFRklYID0gXCIjUkVQTEFDRUQvL1wiOyAvLyDsuZjtmZjrkJwg64uo7Ja066W8IGpvaW4g7J207ZuE7JeQ64+EIOyLneuzhO2VmOq4sCDsnITtlbQgcHJlZml4IOy2lOqwgFxuICAgICAgICAgIGxldCByZW1haW5BcnI6IHN0cmluZ1tdID0gWy4uLndvcmRzXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbWIgb2YgY29tYmluYXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCByZW1haW5TdHIgPSByZW1haW5BcnIuam9pbihcIl9cIik7XG4gICAgICAgICAgICBpZiAocmVtYWluU3RyLmluY2x1ZGVzKGNvbWIudykgJiYgZ2xvc3NhcnkuaGFzKGNvbWIudykpIHtcbiAgICAgICAgICAgICAgcmVtYWluQXJyID0gcmVtYWluU3RyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoY29tYi53LCBSRVBMQUNFRF9QUkVGSVggKyBnbG9zc2FyeS5nZXQoY29tYi53KSlcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJfXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZW1haW5BcnJcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHIuc3RhcnRzV2l0aChSRVBMQUNFRF9QUkVGSVgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIucmVwbGFjZShSRVBMQUNFRF9QUkVGSVgsIFwiXCIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3tFbnRpdHlJRH0vZywgZW50aXR5SWQgPyBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkudGl0bGUgOiBcIlwiKTtcbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4geyBzdWdnZXN0ZWQgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9lbnRpdHkvZmluZE1hbnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGZsYXR0ZW5TdWJzZXRSb3dzKHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdKTogRmxhdHRlblN1YnNldFJvd1tdIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93cy5mbGF0TWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNSb3cgfSA9IHN1YnNldFJvdztcbiAgICAgICAgICAgIHJldHVybiBbc1JvdywgLi4uZmxhdHRlblN1YnNldFJvd3MoY2hpbGRyZW4pXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudGl0aWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50aXR5SWRzLm1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNldFJvd3MgPSBlbnRpdHkuZ2V0U3Vic2V0Um93cygpO1xuXG4gICAgICAgICAgICAvLyB6b2Qg7J247Iqk7YS07Iqk66W8IHNwcmVhZO2VmOuptCBKU09OLnN0cmluZ2lmeeqwgCByZWZlcmVuY2Xrpbwg7J2465287J247Jy866GcIO2SgOyWtOuCtOupsCDsnZHri7XsnbQg7IiY67CxIE1C6rmM7KeAIOu2gO2SgOyWtCBWOCBzdHJpbmcgbGltaXTrpbwg7LSI6rO87ZWc64ukLlxuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB0eXBlczogX3R5cGVzLFxuICAgICAgICAgICAgICBlbnVtczogX2VudW1zLFxuICAgICAgICAgICAgICBlbnVtQ29uZXM6IF9lbnVtQ29uZXMsXG4gICAgICAgICAgICAgIHN1YnNldENvbmVzOiBfc3Vic2V0Q29uZXMsXG4gICAgICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgICAgIH0gPSBlbnRpdHk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgIGZsYXR0ZW5TdWJzZXRSb3dzOiBmbGF0dGVuU3Vic2V0Um93cyhzdWJzZXRSb3dzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgZW50aXRpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFJZCA9IGEucGFyZW50SWQgPz8gYS5pZDtcbiAgICAgICAgICBjb25zdCBiSWQgPSBiLnBhcmVudElkID8/IGIuaWQ7XG4gICAgICAgICAgaWYgKGFJZCA8IGJJZCkgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmIChhSWQgPiBiSWQpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChhSWQgPT09IGJJZCkge1xuICAgICAgICAgICAgaWYgKGEucGFyZW50SWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKGIucGFyZW50SWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBlbnRpdGllcyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGZpbHRlcj86IFwiZW51bXNcIiB8IFwidHlwZXNcIjtcbiAgICAgICAgICByZWxvYWQ/OiBcIjFcIjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvdHlwZUlkc1wiLCBhc3luYyAocmVxdWVzdCk6IFByb21pc2U8eyB0eXBlSWRzOiBzdHJpbmdbXSB9PiA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsdGVyLCByZWxvYWQgfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgaWYgKHJlbG9hZCA9PT0gXCIxXCIpIHtcbiAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGVJZHMgPSAoKCkgPT4ge1xuICAgICAgICAgIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6F65OkXG4gICAgICAgICAgY29uc3QgcHJvamVjdFR5cGVJZHMgPSBPYmplY3QuZW50cmllcyhTb25hbXUuc3luY2VyLnR5cGVzKVxuICAgICAgICAgICAgLmZpbHRlcigoW190eXBlSWQsIHpvZFR5cGVdKSA9PiAoem9kVHlwZS5fem9kLmRlZi50eXBlIGFzIHN0cmluZykgIT09IFwiZW51bVwiKVxuICAgICAgICAgICAgLm1hcCgoW3R5cGVJZCwgX3pvZFR5cGVdKSA9PiB0eXBlSWQpO1xuXG4gICAgICAgICAgLy8g64K07J6lIO2DgOyeheuTpCAoc29uYW11IOy9lOyWtOyXkOyEnCDsoJzqs7UpXG4gICAgICAgICAgY29uc3QgYnVpbHRJblR5cGVJZHMgPSBbLi4uQlVJTFRfSU5fVFlQRV9JRFNdO1xuXG4gICAgICAgICAgLy8g66qo65OgIO2DgOyehSDrs5HtlalcbiAgICAgICAgICBjb25zdCBhbGxUeXBlSWRzID0gWy4uLmJ1aWx0SW5UeXBlSWRzLCAuLi5wcm9qZWN0VHlwZUlkc107XG5cbiAgICAgICAgICBpZiAoZmlsdGVyID09PSBcInR5cGVzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxUeXBlSWRzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudW1JZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpLmZsYXRNYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGZpbHRlciA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gZW51bUlkcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5hbGxUeXBlSWRzLCAuLi5lbnVtSWRzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlSWRzLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGZvcm06IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICB0aXRsZTogc3RyaW5nO1xuICAgICAgICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgICAgICAgIHBhcmVudElkPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2NyZWF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBmb3JtIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyAuLi5mb3JtLCBlbnRpdHlJZDogZm9ybS5pZCB9KTtcblxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgU29uYW11LnN5bmNlci5kZWxFbnRpdHkoZW50aXR5SWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld1ZhbHVlczoge1xuICAgICAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJlbnRJZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnRpdHlCYXNlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBuZXdWYWx1ZXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LnRpdGxlID0gbmV3VmFsdWVzLnRpdGxlO1xuICAgICAgICAgIGVudGl0eS50YWJsZSA9IG5ld1ZhbHVlcy50YWJsZTtcbiAgICAgICAgICBlbnRpdHkucGFyZW50SWQgPSBuZXdWYWx1ZXMucGFyZW50SWQ7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleTogc3RyaW5nO1xuICAgICAgICAgIGZpZWxkczogc3RyaW5nW107XG4gICAgICAgICAgZmllbGRzSW50ZXJuYWw/OiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5U3Vic2V0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBzdWJzZXRLZXksIGZpZWxkcywgZmllbGRzSW50ZXJuYWwgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IGZpZWxkcztcbiAgICAgICAgICBpZiAoZmllbGRzSW50ZXJuYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkc0ludGVybmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID0gZmllbGRzSW50ZXJuYWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgdXBkYXRlZDogZmllbGRzLCB1cGRhdGVkSW50ZXJuYWw6IGZpZWxkc0ludGVybmFsIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgc3Vic2V0S2V5OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFN1YnNldFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgc3Vic2V0S2V5IH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV07XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld1Byb3A6IEVudGl0eVByb3A7XG4gICAgICAgICAgYXQ/OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2NyZWF0ZVByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0LCBuZXdQcm9wIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5jcmVhdGVQcm9wKG5ld1Byb3AsIGF0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdQcm9wOiBFbnRpdHlQcm9wO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeVByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0LCBuZXdQcm9wIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5Lm1vZGlmeVByb3AobmV3UHJvcCwgYXQpO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgYXQ6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsUHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZGVsUHJvcChhdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgYXQ6IG51bWJlcjtcbiAgICAgICAgICB0bzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb3ZlUHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQsIHRvIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5Lm1vdmVQcm9wKGF0LCB0byk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBpbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlJbmRleGVzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBpbmRleGVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5pbmRleGVzID0gaW5kZXhlcztcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgdXBkYXRlZDogaW5kZXhlcyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGVudW1MYWJlbHM6IEVudGl0eVtcImVudW1MYWJlbHNcIl07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUVudW1MYWJlbHNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGVudW1MYWJlbHMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHMgPSBlbnVtTGFiZWxzO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4geyB1cGRhdGVkOiBlbnVtTGFiZWxzIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3RW51bUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2NyZWF0ZUVudW1JZFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgbmV3RW51bUlkIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAgICAgaWYgKGVudGl0eS5lbnVtTGFiZWxzW25ld0VudW1JZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J2066+4IOyhtOyerO2VmOuKlCBlbnVtSWTsnoXri4jri6Q6ICR7bmV3RW51bUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzW25ld0VudW1JZF0gPSBuZXdFbnVtSWQuZW5kc1dpdGgoXCJTdGF0dXNcIilcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogXCLrhbjstpxcIixcbiAgICAgICAgICAgICAgICBoaWRkZW46IFwi7Iio6rmAXCIsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIFwiXCI6IFwiXCIsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGVudW1JZDoge1xuICAgICAgICAgICAgYmVmb3JlOiBzdHJpbmc7XG4gICAgICAgICAgICBhZnRlcjogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUVudW1JZFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZW51bUlkIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgICAgICBjb25zdCBpc0V4aXN0cyA9IGVudGl0eUlkcy5zb21lKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKS5pbmNsdWRlcyhlbnVtSWQuYWZ0ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0V4aXN0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnbTrr7gg7KG07J6s7ZWY64qUIEVudW1JZOyeheuLiOuLpDogJHtlbnVtSWQuYWZ0ZXJ9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5hZnRlcl0gPSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYmVmb3JlXTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmJlZm9yZV07XG5cbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgJiYgcHJvcC5pZCA9PT0gZW51bUlkLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHByb3AuaWQgPSBlbnVtSWQuYWZ0ZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGVudW1JZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxldGVFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGVudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgICAgICBjb25zdCBpc1JlZmVyZW5jZWQgPSBlbnRpdHlJZHNcbiAgICAgICAgICAgIC5mbGF0TWFwKChlbnRpdHlJZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzKVxuICAgICAgICAgICAgLnNvbWUoKHByb3ApID0+IHByb3AudHlwZSA9PT0gXCJlbnVtXCIgJiYgcHJvcC5pZCA9PT0gZW51bUlkKTtcbiAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW51bUlkfeulvCDssLjsobDtlZjripQg7ZSE66Gc7Y287Yuw6rCAIOyhtOyerO2VqeuLiOuLpC5gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZF07XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICB0YXJnZXQ6IFwiZW50aXR5XCIgfCBcInByb3BcIiB8IFwiZW51bVwiIHwgXCJzdWJzZXRcIjtcbiAgICAgICAgICBwcm9wTmFtZT86IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgc3Vic2V0S2V5Pzogc3RyaW5nO1xuICAgICAgICAgIGNvbmU6IENvbmU7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L3VwZGF0ZUNvbmVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHRhcmdldCwgcHJvcE5hbWUsIGVudW1JZCwgc3Vic2V0S2V5LCBjb25lIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gXCJlbnRpdHlcIikge1xuICAgICAgICAgICAgZW50aXR5LmNvbmUgPSBjb25lO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBcInByb3BcIiAmJiBwcm9wTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IFwiZW51bVwiICYmIGVudW1JZCkge1xuICAgICAgICAgICAgZW50aXR5LmVudW1Db25lc1tlbnVtSWRdID0gY29uZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gXCJzdWJzZXRcIiAmJiBzdWJzZXRLZXkpIHtcbiAgICAgICAgICAgIGVudGl0eS5zdWJzZXRDb25lc1tzdWJzZXRLZXldID0gY29uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc/OiBib29sZWFuO1xuICAgICAgICAgIG9ubHlFbXB0eT86IGJvb2xlYW47XG4gICAgICAgICAgbG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9nZW5lcmF0ZUNvbmVzXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgcHJlc2VydmVFeGlzdGluZywgb25seUVtcHR5LCBsb2NhbGUgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnRpdHkg7KG07J6sIOyXrOu2gCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgICAgLy8gbG9jYWxlIOq4sOuzuOqwkjogU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUg7IKs7JqpXG4gICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgICAgICAgICBsb2NhbGUgPz8gKFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIGFzIFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik7XG5cbiAgICAgICAgICAgIC8vIENvbmUg7IOd7ISxXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6IHByZXNlcnZlRXhpc3RpbmcgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgb25seUVtcHR5OiBvbmx5RW1wdHkgPz8gZmFsc2UsXG4gICAgICAgICAgICAgIGxvY2FsZTogZWZmZWN0aXZlTG9jYWxlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cbiAgICAgICAgICAgIC8vIEVudGl0eSBub3QgZm91bmRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwi7KG07J6s7ZWY7KeAIOyViuuKlCBFbnRpdHlcIikpIHtcbiAgICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDQwNCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWAsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFQSSDtgqQg7JeG7J2MXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogXCJBUEkga2V5IG5vdCBjb25maWd1cmVkXCIsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJhdGUgbGltaXRcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiUmF0ZSBsaW1pdCBleGNlZWRlZFwiKSkge1xuICAgICAgICAgICAgICByZXBseS5zdGF0dXMoNDI5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogXCJSYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDquLDtg4Ag7JeQ65+sXG4gICAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBlcnJvcjogYENvbmUgZ2VuZXJhdGlvbiBmYWlsZWQ6ICR7bWVzc2FnZX1gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2dldFRhYmxlQ29sdW1uc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBlbnRpdHkuZ2V0VGFibGVDb2x1bW5zKCk7XG4gICAgICAgIHJldHVybiB7IGNvbHVtbnMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9taWdyYXRpb25zL3N0YXR1c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuXG4gICAgICAgIHJldHVybiB7IHN0YXR1cyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiIHwgXCJzaGFkb3dcIjtcbiAgICAgICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICAgICAgZm9yY2U/OiBib29sZWFuO1xuICAgICAgICAgIGZvcmNlUmVhc29uPzogc3RyaW5nO1xuICAgICAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFxuICAgICAgICBcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIixcbiAgICAgICAgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdCB8IFNsYWNrQ29uZmlybVBlbmRpbmdSZXN1bHQ+ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGFjdGlvbiwgdGFyZ2V0cywgZm9yY2UsIGZvcmNlUmVhc29uLCByZXF1ZXN0b3IgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGlmIChhY3Rpb24gPT09IFwic2hhZG93XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2xhY2sg7Iq57J24IOyytO2BrCAoYXBwbHkg7Iuc7JeQ66eMKVxuICAgICAgICAgIGlmIChhY3Rpb24gPT09IFwiYXBwbHlcIikge1xuICAgICAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IHRhcmdldHMuc29tZSgodCkgPT4gc2xhY2tDb25maXJtLmlzVGFyZ2V0UmVxdWlyZXNBcHByb3ZhbCh0KSk7XG5cbiAgICAgICAgICAgIC8vIOuhnOy7rCBEQuyduCDqsr3smrAg7Iq57J24IOyKpO2CtVxuICAgICAgICAgICAgY29uc3QgbG9jYWxIb3N0cyA9IFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl07XG4gICAgICAgICAgICBjb25zdCBpc0xvY2FsVGFyZ2V0ID0gdGFyZ2V0cy5ldmVyeSgodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdO1xuICAgICAgICAgICAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSG9zdHMuaW5jbHVkZXMoaG9zdC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocmVxdWlyZXNBcHByb3ZhbCAmJiBzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkgJiYgIWlzTG9jYWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjb25ucyB9ID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG5cbiAgICAgICAgICAgICAgLy8g66qo65OgIO2DgOqynyBEQuyXkOyEnCBwZW5kaW5n7J24IOuniOydtOq3uOugiOydtOyFmOydmCDtlansp5HtlansnYQg6rWs7ZWp64uI64ukLlxuICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nTWlncmF0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgY29ubnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoY29ubikgPT4gdGFyZ2V0cy5pbmNsdWRlcyhjb25uLmNvbm5LZXkpKVxuICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcCgoY29ubikgPT4gY29ubi5wZW5kaW5nKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nTWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8g6riw7KG0IOyKueyduCDsmpTssq0g7ZmV7J24XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFja0NvbmZpcm0uZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmdNaWdyYXRpb25zKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgLy8g6riw7KG0IOyalOyyreydtCDsnojsnLzrqbQg7Iq57J24IOyDge2DnCDtmZXsnbhcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgYXBwcm92ZWQsIHJlamVjdGVkIH0gPSBhd2FpdCBzbGFja0NvbmZpcm0uY2hlY2tBcHByb3ZhbChcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoYXBwcm92ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Iq57J2465CoIOKGkiDsi6TtlolcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5sb2dFeGVjdXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5taWdyYXRpb25SZWplY3RlZFwiKSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIOynhO2WiVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uZm9yY2VBcHByb3ZhbChcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5sb2dFeGVjdXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g64yA6riw7KSRXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwZW5kaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICB0czogZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyDiCDsirnsnbgg7JqU7LKtIOuwnOyGoVxuICAgICAgICAgICAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cyB9ID0gYXdhaXQgc2xhY2tDb25maXJtLnBvc3RBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWdyYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLnNhdmVSZXF1ZXN0KHBlbmRpbmdNaWdyYXRpb25zLCBjaGFubmVsLCB0cyk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICB0cyxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgICAgIHRzOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9jaGVja0FwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuXG4gICAgICAgIGlmICghc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgYXBwcm92ZWQ6IHRydWUsIHJlamVjdGVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNsYWNrQ29uZmlybS5jaGVja0FwcHJvdmFsKGNoYW5uZWwsIHRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICAgICAgdHM6IHN0cmluZztcbiAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICByZXF1ZXN0b3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9mb3JjZUFwcHJvdmFsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMsIHJlYXNvbiwgcmVxdWVzdG9yIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcblxuICAgICAgICBpZiAoIXNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmZvcmNlQXBwcm92YWwoY2hhbm5lbCwgdHMsIHJlYXNvbiwgcmVxdWVzdG9yKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNvZGVOYW1lczogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvbWlncmF0aW9ucy9kZWxDb2Rlc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvZGVOYW1lcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICByZXR1cm4gYXdhaXQgbWlncmF0b3IuZGVsQ29kZXMoY29kZU5hbWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvbWlncmF0aW9ucy9nZW5lcmF0ZVByZXBhcmVkQ29kZXNcIiwgYXN5bmMgKF9yZXF1ZXN0dCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgICB0ZW1wbGF0ZUtleXM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL2dldFN0YXR1c1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkcywgdGVtcGxhdGVLZXlzOiBfdGVtcGxhdGVLZXlzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGlmICgoZW50aXR5SWRzID8/IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5lbnRpdHlJZHNSZXF1aXJlZFwiKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKF90ZW1wbGF0ZUtleXMgPz8gW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnRlbXBsYXRlS2V5c1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnRpbmdcbiAgICAgICAgZW50aXR5SWRzLnNvcnQoKGEsIGIpID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZUtleXMgPSBUZW1wbGF0ZUtleS5vcHRpb25zLmZpbHRlcigodGspID0+IF90ZW1wbGF0ZUtleXMuaW5jbHVkZXModGspKTtcblxuICAgICAgICBjb25zdCBjb21iaW5hdGlvbnMgPSBlbnRpdHlJZHMuZmxhdE1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGVLZXlzLm1hcCgodGVtcGxhdGVLZXkpID0+IFtlbnRpdHlJZCwgdGVtcGxhdGVLZXldKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBjb21iaW5hdGlvbnMubWFwKGFzeW5jIChbZW50aXR5SWQsIHRlbXBsYXRlS2V5XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdWJQYXRoLCBmdWxsUGF0aCwgaXNFeGlzdHMgfSA9IGF3YWl0IFNvbmFtdS5zeW5jZXIuY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgIHRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgICBmdWxsUGF0aCxcbiAgICAgICAgICAgICAgaXNFeGlzdHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzdGF0dXNlcyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICB0ZW1wbGF0ZUtleTogc3RyaW5nO1xuICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgICAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc2NhZmZvbGRpbmcvZ2VuZXJhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm9wdGlvbnNSZXF1aXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAxLiDrqqjrk6Ag7YWc7ZSM66a/7JeQ7IScIO2VhOyalO2VnCBkaWN0IO2CpOulvCDsiJjsp5FcbiAgICAgICAgY29uc3Qga2V5cyA9IG9wdGlvbnMuZmxhdE1hcCgoeyB0ZW1wbGF0ZUtleSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUuZ2V0UmVxdWlyZWREaWN0S2V5cygpID8/IFtdO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyAyLiB0YXJnZXTrs4TroZwgZW5zdXJlRGljdEtleXMg7Zi47LacICjsiJzssKgg7LKY66asKVxuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmVuc3VyZURpY3RLZXlzKFsuLi5uZXcgU2V0KGtleXMpXSk7XG5cbiAgICAgICAgLy8gMy4g7YWc7ZSM66a/IOyDneyEsSAo67OR66CsIOyymOumrClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgb3B0aW9ucy5tYXAoYXN5bmMgKHsgZW50aXR5SWQsIHRlbXBsYXRlS2V5LCBlbnVtSWQsIG92ZXJ3cml0ZSB9KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlS2V5IGFzIFRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgZW51bUlkLFxuICAgICAgICAgICAgICAgIH0gYXMge1xuICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBpZiAoaXNTb0V4Y2VwdGlvbihlKSAmJiBlLnN0YXR1c0NvZGUgPT09IDU0MSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuZmlsdGVyKG5vbk51bGxhYmxlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmFsbEZpbGVzR2VuZXJhdGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIG9wdGlvbjoge1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5OiBzdHJpbmc7XG4gICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9wcmV2aWV3XCIsIGFzeW5jIChyZXF1ZXN0KTogUHJvbWlzZTx7IHBhdGhBbmRDb2RlczogUGF0aEFuZENvZGVbXSB9PiA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHRlbXBsYXRlS2V5LCAuLi50ZW1wbGF0ZU9wdGlvbnMgfSA9IG9wdGlvbjtcbiAgICAgICAgICBjb25zdCBwYXRoQW5kQ29kZXMgPSBhd2FpdCBTb25hbXUuc3luY2VyLnJlbmRlclRlbXBsYXRlKFxuICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICB0ZW1wbGF0ZU9wdGlvbnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7IHBhdGhBbmRDb2RlcyB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBzb3VyY2VEQiwgdGFyZ2V0REIsIHNlYXJjaCwgZHVwbGljYXRlQ2hlY2sgfSA9IHJlcXVlc3QuYm9keSBhcyB7XG4gICAgICAgICAgc291cmNlREI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIHRhcmdldERCOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICBzZWFyY2g6IEZpeHR1cmVTZWFyY2hPcHRpb25zO1xuICAgICAgICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5nZXRGaXh0dXJlcyhzb3VyY2VEQiwgdGFyZ2V0REIsIHNlYXJjaCwgZHVwbGljYXRlQ2hlY2spO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlL2ltcG9ydFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGRiLCBmaXh0dXJlcyB9ID0gcmVxdWVzdC5ib2R5IGFzIHtcbiAgICAgICAgICBkYjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXMoZGIsIGZpeHR1cmVzKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZS9hZGRGaXh0dXJlTG9hZGVyXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29kZSB9ID0gcmVxdWVzdC5ib2R5IGFzIHsgY29kZTogc3RyaW5nIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmFkZEZpeHR1cmVMb2FkZXIoY29kZSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvaTE4bi9kaWN0aW9uYXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2kxOG4vZXhwb3J0XCIsIGFzeW5jIChfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSwgYnVmZmVyIH0gPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmV4cG9ydFRvRXhjZWwoKTtcbiAgICAgICAgcmVwbHlcbiAgICAgICAgICAuaGVhZGVyKFxuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXRcIixcbiAgICAgICAgICApXG4gICAgICAgICAgLmhlYWRlcihcIkNvbnRlbnQtRGlzcG9zaXRpb25cIiwgYGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJHtmaWxlbmFtZX1cImApXG4gICAgICAgICAgLnNlbmQoYnVmZmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvaTE4bi9pbXBvcnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3QuZmlsZSgpO1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5maWxlTm90VXBsb2FkZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRhdGEudG9CdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuaW1wb3J0RnJvbUV4Y2VsKGJ1ZmZlcik7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb2xkS2V5OiBzdHJpbmc7XG4gICAgICAgICAgbmV3S2V5OiBzdHJpbmc7XG4gICAgICAgICAgc291cmNlOiBcImVudGl0eVwiIHwgXCJwcm9qZWN0XCIgfCBcInNvbmFtdVwiO1xuICAgICAgICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL3VwZGF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LnVwZGF0ZUVudHJ5KHJlcXVlc3QuYm9keSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvaTE4bi9jcmVhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5jcmVhdGVFbnRyeShyZXF1ZXN0LmJvZHkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvaTE4bi9kZWxldGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5kZWxldGVFbnRyeShyZXF1ZXN0LmJvZHkua2V5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogeyBrZXlzOiBzdHJpbmdbXSB9IH0+KFwiL2FwaS9pMThuL2NoZWNrVXNhZ2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuY2hlY2tVc2FnZShyZXF1ZXN0LmJvZHkua2V5cyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGFza3MgQVBJXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS90YXNrcy9zdGF0dXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFNvbmFtdS53b3JrZmxvd3M7XG4gICAgICAgICAgcmV0dXJuIHsgYWN0aXZlOiB0cnVlIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3Rhc2tzL3dvcmtmbG93RGVmaW5pdGlvbnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IFNvbmFtdS53b3JrZmxvd3Mud29ya2Zsb3dEZWZpbml0aW9ucztcbiAgICAgICAgcmV0dXJuIHsgZGVmaW5pdGlvbnMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBsaW1pdD86IHN0cmluZztcbiAgICAgICAgICBhZnRlcj86IHN0cmluZztcbiAgICAgICAgICBiZWZvcmU/OiBzdHJpbmc7XG4gICAgICAgICAgb3JkZXI/OiBcImFzY1wiIHwgXCJkZXNjXCI7XG4gICAgICAgICAgc3RhdHVzPzogc3RyaW5nO1xuICAgICAgICAgIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgICAgICAgICBjcmVhdGVkQWZ0ZXI/OiBzdHJpbmc7XG4gICAgICAgICAgY3JlYXRlZEJlZm9yZT86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgY29uc3QgeyBsaW1pdCwgYWZ0ZXIsIGJlZm9yZSwgb3JkZXIsIHN0YXR1cywgd29ya2Zsb3dOYW1lLCBjcmVhdGVkQWZ0ZXIsIGNyZWF0ZWRCZWZvcmUgfSA9XG4gICAgICAgICAgcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubGlzdFdvcmtmbG93UnVucyh7XG4gICAgICAgICAgbGltaXQ6IGxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KGxpbWl0LCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYWZ0ZXIsXG4gICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgIG9yZGVyLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzID8gc3RhdHVzLnNwbGl0KFwiLFwiKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgY3JlYXRlZEFmdGVyOiBjcmVhdGVkQWZ0ZXIgPyBuZXcgRGF0ZShjcmVhdGVkQWZ0ZXIpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNyZWF0ZWRCZWZvcmU6IGNyZWF0ZWRCZWZvcmUgPyBuZXcgRGF0ZShjcmVhdGVkQmVmb3JlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICBjb25zdCB3b3JrZmxvd1J1biA9IGF3YWl0IGJhY2tlbmQuZ2V0V29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF3b3JrZmxvd1J1bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2Zsb3cgcnVuIG5vdCBmb3VuZDogJHtyZXF1ZXN0LnBhcmFtcy5pZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd29ya2Zsb3dSdW47XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvY2FuY2VsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLmNhbmNlbFdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvcGF1c2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQucGF1c2VXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL3Jlc3VtZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5yZXN1bWVXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGxpbWl0Pzogc3RyaW5nO1xuICAgICAgICAgIGFmdGVyPzogc3RyaW5nO1xuICAgICAgICAgIGJlZm9yZT86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL3N0ZXBzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHsgbGltaXQsIGFmdGVyLCBiZWZvcmUgfSA9IHJlcXVlc3QucXVlcnk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLmxpc3RTdGVwQXR0ZW1wdHMoe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICAgIGxpbWl0OiBsaW1pdCA/IE51bWJlci5wYXJzZUludChsaW1pdCwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFmdGVyLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBIZWFsdGggQ2hlY2sgQVBJXG4gICAgICAgKiBNQ1Ag64+E6rWs6rCAIFNvbmFtdSDshJzrsoTrpbwg7J6Q64+ZIOqwkOyngO2VmOq4sCDsnITtlZwg7JeU65Oc7Y+s7J247Yq4XG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3NvbmFtdS9oZWFsdGhcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHJlcXVlc3Quc2VydmVyLnNlcnZlci5hZGRyZXNzKCk7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBhZGRyZXNzICYmIHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiID8gYWRkcmVzcy5wb3J0IDogMDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgIHByb2plY3Q6IHByb2Nlc3MuY3dkKCkuc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwidW5rbm93blwiLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOyDneyEsSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgY291bnQ/OiBudW1iZXI7XG4gICAgICAgICAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgdGFyZ2V0RGI/OiBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2dlbmVyYXRlXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eSwgY291bnQgPSAxLCBvdmVycmlkZXMsIHRhcmdldERiID0gXCJmaXh0dXJlXCIgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyDtg4Dqsp8gREIg7ISk7KCVIOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCBkYkNvbmZpZyA9IHRhcmdldERiID09PSBcImZpeHR1cmVcIiA/IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlIDogU29uYW11LmRiQ29uZmlnLnRlc3Q7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEZpeHR1cmVHZW5lcmF0b3Ig7IOd7ISxXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZGIsIGRiLCB0YXJnZXREYiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyDri6jsnbwgRW50aXR5IOuwsOy5mCDsg53shLFcbiAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgb3ZlcnJpZGVzOiBvdmVycmlkZXMgPz8ge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBjb3VudDogZml4dHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgICB0YXJnZXREYixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIO2DkOyDiSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgc3RyYXRlZ3k6IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICB3aGVyZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2V4cGxvcmVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5LCBzdHJhdGVneSwgbGltaXQgPSAxMCwgd2hlcmUgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyEpOyglSDqsIDsoLjsmKTquLBcbiAgICAgICAgY29uc3QgZml4dHVyZURiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmU7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShmaXh0dXJlRGJDb25maWcpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGF0YUV4cGxvcmVyIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihmaXh0dXJlRGIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5LCB7XG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBmaXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOuNsOydtO2EsCDqsIDsoLjsmKTquLAgKGZldGNoKSBBUElcbiAgICAgICAqIHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQgRELsl5DshJwg7Iuk7KCcIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneT86IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9mZXRjaFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBzdHJhdGVneSA9IFwicmVjZW50XCIsXG4gICAgICAgICAgbGltaXQgPSAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zID0gdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICAgIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgLy8gU291cmNlIERCIChwcm9kdWN0aW9uL2RldmVsb3BtZW50KSAtIOydveq4sCDsoITsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG5cbiAgICAgICAgLy8gVGFyZ2V0IERCIChmaXh0dXJlKVxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRml4dHVyZUdlbmVyYXRvciDsg53shLFcbiAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyBwcm9kdWN0aW9uIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHksIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zLFxuICAgICAgICAgICAgbWF4RGVwdGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICAgICAgaW1wb3J0ZWQ6IHJlc3VsdHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gc291cmNlRGLripQgU29uYW116rCAIOq0gOumrO2VmOuvgOuhnCBkZXN0cm957ZWY7KeAIOyViuydjFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIOyCreygnCAoY2xlYW4pIEFQSVxuICAgICAgICogRksg7Iic7ISc66W8IOqzoOugpO2VmOyXrCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0aWVzPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvY2xlYW5cIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXRpZXMgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyXsOqysFxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g7IKt7KCc7ZWgIEVudGl0eSDrqqnroZ0g6rKw7KCVXG4gICAgICAgICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPVxuICAgICAgICAgICAgZW50aXRpZXMgJiYgZW50aXRpZXMubGVuZ3RoID4gMCA/IGVudGl0aWVzIDogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICAgIC8vIEVudGl0eSBJROulvCDthYzsnbTruJTrqoXsnLzroZwg67OA7ZmYIChzbmFrZV9jYXNlIOuzteyImO2YlSlcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzID0gdGFyZ2V0RW50aXRpZXMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGVudGl0eS50YWJsZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFBvc3RncmVTUUw6IFRSVU5DQVRFIENBU0NBREXroZwgRksg7Iic7IScIOustOq0gO2VmOqyjCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgICAgLy8gQ0FTQ0FERSDsmLXshZjsnLzroZwg7J2Y7KG07ISxIOyeiOuKlCDrjbDsnbTthLDrj4Qg7ZWo6ruYIOyCreygnFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5yYXcoXG4gICAgICAgICAgICBgVFJVTkNBVEUgVEFCTEUgJHt0YWJsZU5hbWVzLm1hcCgodCkgPT4gYFwiJHt0fVwiYCkuam9pbihcIiwgXCIpfSBSRVNUQVJUIElERU5USVRZIENBU0NBREVgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFuZWQ6IHRhYmxlTmFtZXMsXG4gICAgICAgICAgICBjb3VudDogdGFibGVOYW1lcy5sZW5ndGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENERCBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2NkZC90cmVlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldENkZFRyZWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgZmlsZVBhdGg6IHN0cmluZyB9IH0+KFwiL2FwaS9jZGQvcmVhZENvbnRlbnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICByZXR1cm4gcmVhZENvbnRlbnQoZmlsZVBhdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogeyBmaWxlUGF0aDogc3RyaW5nIH0gfT4oXCIvYXBpL2NkZC9lZGl0Q29udGVudFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiBlZGl0Q29udGVudChmaWxlUGF0aCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGZpbGVQYXRoOiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL29wZW5Tb3VyY2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBvcGVuU291cmNlRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDREQgUnVsZXMgQVBJXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9jZGQvcnVsZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gbGlzdFJ1bGVzKCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IHJ1bGVLZXk6IHN0cmluZyB9IH0+KFwiL2FwaS9jZGQvcmVhZFJ1bGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBydWxlS2V5IH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiByZWFkUnVsZShydWxlS2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IENkZEFkZFJ1bGVSZXF1ZXN0IH0+KFwiL2FwaS9jZGQvYWRkUnVsZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYWRkUnVsZShyZXF1ZXN0LmJvZHkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENERCBBQyBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2NkZC9hY1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRBY0xpc3QoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB1aS13ZWIg67mM65OcIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IHVpRGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi91aS13ZWJcIik7XG5cbiAgICAgIC8vIOygleyggSDtjIzsnbwg7ISc67mZOiDro6jtirgg7Y+0642UIOyghOyytCAoYXNzZXRzLCBzZXR0aW5nLnN2ZyDrk7EpXG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvc3RhdGljXCIpLCB7XG4gICAgICAgIHJvb3Q6IHVpRGlzdFBhdGgsXG4gICAgICAgIHByZWZpeDogXCIvXCIsXG4gICAgICAgIGRlY29yYXRlUmVwbHk6IGZhbHNlLFxuICAgICAgICB3aWxkY2FyZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gU1BBIGZhbGxiYWNrIC0g7KCV7KCBIO2MjOydvOydtCDsl4bripQg66qo65OgIOqyveuhnOuKlCBpbmRleC5odG1s66GcXG4gICAgICBzZXJ2ZXIuZ2V0KFwiKlwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJlcGx5LmhlYWRlcnMoeyBcIkNvbnRlbnQtdHlwZVwiOiBcInRleHQvaHRtbFwiIH0pLnNlbmQoXG4gICAgICAgICAgZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHVpRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSlcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShcInt7cHJvamVjdE5hbWV9fVwiLCBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blNvbmFtdVByb2plY3RcIiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgcHJlZml4OiBcIi9zb25hbXUtdWlcIiB9LFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdURBLGVBQXNCLGtCQUFrQixTQUEwQjtBQUNoRSxTQUFRLFNBQ04sT0FBTyxXQUFXO0VBRWhCLE1BQU0sV0FBVyxJQUFJLFVBQVU7RUFHL0IsZUFBZSxvQkFBdUIsSUFBa0M7R0FDdEUsTUFBTSxjQUFjLElBQUksU0FBZSxZQUFZO0lBQ2pELE1BQU0sZ0JBQWdCO0FBQ3BCLGtCQUFhLFFBQVE7QUFDckIsY0FBUzs7SUFHWCxNQUFNLFVBQVUsaUJBQWlCO0FBQy9CLFlBQU8sT0FBTyxhQUFhLElBQUksa0JBQWtCLFFBQVE7QUFDekQsY0FBUztPQUNSLEtBQUs7QUFFUixXQUFPLE9BQU8sYUFBYSxLQUFLLGtCQUFrQixRQUFRO0tBQzFEO0dBRUYsTUFBTSxTQUFTLE1BQU0sSUFBSTtBQUN6QixTQUFNO0FBQ04sVUFBTzs7QUFHVCxRQUFNLFNBQVMsT0FBTztBQUV0QixTQUFPLElBQUksc0JBQXNCLFlBQVk7QUFD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
811
+
812
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHJhbmdlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgc29uYW11RGljdGlvbmFyeSB9IGZyb20gXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgaXNTb0V4Y2VwdGlvbixcbiAgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IHR5cGUgTWlncmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuaW1wb3J0IHsgU2xhY2tDb25maXJtIH0gZnJvbSBcIi4uL21pZ3JhdGlvbi9zbGFjay1jb25maXJtXCI7XG5pbXBvcnQgeyB0eXBlIFNsYWNrQ29uZmlybVBlbmRpbmdSZXN1bHQgfSBmcm9tIFwiLi4vbWlncmF0aW9uL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gXCIuLi90ZW1wbGF0ZS90ZW1wbGF0ZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEYXRhRXhwbG9yZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHsgQlVJTFRfSU5fVFlQRV9JRFMsIFRlbXBsYXRlS2V5IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyxcbiAgdHlwZSBGbGF0dGVuU3Vic2V0Um93LFxuICB0eXBlIFBhdGhBbmRDb2RlLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBzZXRBaUFwaSB9IGZyb20gXCIuL2FpLWFwaVwiO1xuaW1wb3J0IHsgdHlwZSBDZGRBZGRSdWxlUmVxdWVzdCB9IGZyb20gXCIuL2NkZC1zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBhZGRSdWxlLFxuICBlZGl0Q29udGVudCxcbiAgZ2V0QWNMaXN0LFxuICBnZXRDZGRUcmVlLFxuICBsaXN0UnVsZXMsXG4gIG9wZW5Tb3VyY2VGaWxlLFxuICByZWFkQ29udGVudCxcbiAgcmVhZFJ1bGUsXG59IGZyb20gXCIuL2NkZC1zZXJ2aWNlXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb25hbXVVSUFwaVBsdWdpbihmYXN0aWZ5OiBGYXN0aWZ5SW5zdGFuY2UpIHtcbiAgZmFzdGlmeS5yZWdpc3RlcihcbiAgICBhc3luYyAoc2VydmVyKSA9PiB7XG4gICAgICAvLyBtaWdyYXRvclxuICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcblxuICAgICAgLy8gd2FpdEZvckhNUkNvbXBsZXRlZFxuICAgICAgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckhNUkNvbXBsZXRlZDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB3YWl0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgU29uYW11LnN5bmNlci5ldmVudEVtaXR0ZXIub2ZmKFwib25ITVJDb21wbGV0ZWRcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSwgMTUwMCk7XG5cbiAgICAgICAgICBTb25hbXUuc3luY2VyLmV2ZW50RW1pdHRlci5vbmNlKFwib25ITVJDb21wbGV0ZWRcIiwgaGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgICAgIGF3YWl0IHdhaXRQcm9taXNlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRBaUFwaShzZXJ2ZXIpO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9zb25hbXUvY29uZmlnXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFNvbmFtdS5jb25maWc7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZW50aXR5SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgcHJlc2V0PzogXCJ0eXBlc1wiIHwgXCJlbnRpdHkuanNvblwiIHwgXCJnZW5lcmF0ZWRcIjtcbiAgICAgICAgICBhYnNQYXRoPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rvb2xzL29wZW5Wc2NvZGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgcHJlc2V0LCBhYnNQYXRoIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFBhdGggPSAoKCkgPT4ge1xuICAgICAgICAgIGlmIChlbnRpdHlJZCAmJiBwcmVzZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZXMgfSA9IGVudGl0eTtcblxuICAgICAgICAgICAgY29uc3QgeyBhcGlSb290UGF0aCB9ID0gU29uYW11O1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNldCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0eXBlc1wiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke25hbWVzLmZzfS50eXBlcy50c2A7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudGl0eS5qc29uXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LmVudGl0eS5qc29uYDtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2VuZXJhdGVkXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LmdlbmVyYXRlZC50c2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXBpUm9vdFBhdGh9L3NyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5wYXJlbnRGc30vJHtmaWxlbmFtZX1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWFic1BhdGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IucHJlc2V0T3JBYnNQYXRoUmVxdWlyZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFic1BhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICBleGVjU3luYyhgY29kZSAke3RhcmdldFBhdGh9YCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgb3JpZ2luOiBzdHJpbmc7XG4gICAgICAgICAgZW50aXR5SWQ/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdG9vbHMvZ2V0U3VnZ2VzdGlvblwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9yaWdpbiwgZW50aXR5SWQgfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgLy8g7LmY7ZmYIOyaqeyWtOynkVxuICAgICAgICBjb25zdCBnbG9zc2FyeSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgICAgICAgICBbXCJzdGF0dXNcIiwgXCLsg4Htg5xcIl0sXG4gICAgICAgICAgW1widHlwZVwiLCBcIu2DgOyehVwiXSxcbiAgICAgICAgICBbXCJpbWFnZVwiLCBcIuydtOuvuOyngFwiXSxcbiAgICAgICAgICBbXCJpbWFnZXNcIiwgXCLsnbTrr7jsp4DrpqzsiqTtirhcIl0sXG4gICAgICAgICAgW1widXJsXCIsIFwiVVJMXCJdLFxuICAgICAgICAgIFtcImlkXCIsIFwiSURcIl0sXG4gICAgICAgICAgW1wibmFtZVwiLCBge0VudGl0eUlEfeuqhWBdLFxuICAgICAgICAgIFtcInRpdGxlXCIsIFwie0VudGl0eUlEfeuqhVwiXSxcbiAgICAgICAgICBbXCJwYXJlbnRcIiwgXCLsg4HsnIR7RW50aXR5SUR9XCJdLFxuICAgICAgICAgIFtcImRlc2NcIiwgXCLshKTrqoVcIl0sXG4gICAgICAgICAgW1wiYXRcIiwgXCLsnbzsi5xcIl0sXG4gICAgICAgICAgW1wiY3JlYXRlZFwiLCBcIuuTseuhnVwiXSxcbiAgICAgICAgICBbXCJ1cGRhdGVkXCIsIFwi7IiY7KCVXCJdLFxuICAgICAgICAgIFtcImRlbGV0ZWRcIiwgXCLsgq3soJxcIl0sXG4gICAgICAgICAgW1wiYnlcIiwgXCLsnKDsoIBcIl0sXG4gICAgICAgICAgW1wiZGF0ZVwiLCBcIuydvOyekFwiXSxcbiAgICAgICAgICBbXCJ0aW1lXCIsIFwi7Iuc6rCEXCJdLFxuICAgICAgICAgIFtcImtvXCIsIFwiKO2VnOq4gClcIl0sXG4gICAgICAgICAgW1wiZW5cIiwgXCIo7JiB66y4KVwiXSxcbiAgICAgICAgICBbXCJrcndcIiwgXCIo7JuQKVwiXSxcbiAgICAgICAgICBbXCJ1c2RcIiwgXCIoVVNEKVwiXSxcbiAgICAgICAgICBbXCJjb2xvclwiLCBcIuy7rOufrFwiXSxcbiAgICAgICAgICBbXCJjb2RlXCIsIFwi7L2U65OcXCJdLFxuICAgICAgICAgIFtcInhcIiwgXCJY7KKM7ZGcXCJdLFxuICAgICAgICAgIFtcInlcIiwgXCJZ7KKM7ZGcXCJdLFxuICAgICAgICAgIFtcImN1cnJlbnRcIiwgXCLtmITsnqxcIl0sXG4gICAgICAgICAgW1wic3RvY2tcIiwgXCLsnqzqs6BcIl0sXG4gICAgICAgICAgW1widG90YWxcIiwgXCLstJ1cIl0sXG4gICAgICAgICAgW1wiYWRtaW5cIiwgXCLqtIDrpqzsnpBcIl0sXG4gICAgICAgICAgW1wiZ3JvdXBcIiwgXCLqt7jro7lcIl0sXG4gICAgICAgICAgW1wiaXRlbVwiLCBcIuyVhOydtO2FnFwiXSxcbiAgICAgICAgICBbXCJjbnRcIiwgXCLsiJjrn4lcIl0sXG4gICAgICAgICAgW1wicHJpY2VcIiwgXCLqsIDqsqlcIl0sXG4gICAgICAgICAgW1wicHJlc2V0XCIsIFwi7ZSE66as7IWLXCJdLFxuICAgICAgICAgIFtcImFjY3RcIiwgXCLqs4TsooxcIl0sXG4gICAgICAgICAgW1widGVsXCIsIFwi7KCE7ZmU67KI7Zi4XCJdLFxuICAgICAgICAgIFtcIm5vXCIsIFwi67KI7Zi4XCJdLFxuICAgICAgICAgIFtcImJvZHlcIiwgXCLrgrTsmqlcIl0sXG4gICAgICAgICAgW1wiY29udGVudFwiLCBcIuuCtOyaqVwiXSxcbiAgICAgICAgICBbXCJvcmRlcm5vXCIsIFwi7KCV66Cs7Iic7IScXCJdLFxuICAgICAgICAgIFtcInByaW9yaXR5XCIsIFwi7Jqw7ISg7Iic7JyEXCJdLFxuICAgICAgICAgIFtcInRleHRcIiwgXCLthY3siqTtirhcIl0sXG4gICAgICAgICAgW1wia2V5XCIsIFwi7YKkXCJdLFxuICAgICAgICAgIFtcInN1bVwiLCBcIu2VqeyCsFwiXSxcbiAgICAgICAgICBbXCJleHBlY3RlZFwiLCBcIuyYiOyDgVwiXSxcbiAgICAgICAgICBbXCJhY3R1YWxcIiwgXCLsi6TsoJxcIl0sXG4gICAgICAgIF0pO1xuICAgICAgICAvLyDsoITssrQg7JeU7Yuw7YuwIOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwIO2DgOydtO2LgOqzvCDtlITroa0g7ISk66qF7J2EIOy5mO2ZmCDsmqnslrTsp5Hsl5Ag7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKSkge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBpZiAoKGVudGl0eS50aXRsZSA/PyBcIlwiKSAhPT0gXCJcIikge1xuICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KGluZmxlY3Rpb24udW5kZXJzY29yZShlbnRpdHkuaWQpLCBlbnRpdHkudGl0bGUpO1xuICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KFxuICAgICAgICAgICAgICBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUoZW50aXR5LmlkKSksXG4gICAgICAgICAgICAgIGAke2VudGl0eS50aXRsZX3rpqzsiqTtirhgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbnRpdHkucHJvcHMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdsb3NzYXJ5Lmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wLmRlc2MpIHtcbiAgICAgICAgICAgICAgZ2xvc3Nhcnkuc2V0KHByb3AubmFtZSwgcHJvcC5kZXNjLnJlcGxhY2UoZW50aXR5LnRpdGxlID8/IFwiXCIsIFwie0VudGl0eUlEfVwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWdnZXN0ZWQgPSAoKCkgPT4ge1xuICAgICAgICAgIC8vIOuLqOyWtCDrtoTrpqwsIOqwgOuKpe2VnCDsobDtlakg7IOd7ISxXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBvcmlnaW4uc3BsaXQoXCJfXCIpO1xuICAgICAgICAgIGNvbnN0IGNvbWJpbmF0aW9ucyA9IFsuLi5yYW5nZSh3b3Jkcy5sZW5ndGgsIDAsIC0xKV0uZmxhdE1hcCgobGVuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAuLi5yYW5nZSgwLCB3b3Jkcy5sZW5ndGggLSBsZW4gKyAxLCAoaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGxlbixcbiAgICAgICAgICAgICAgICAgIHc6IHdvcmRzLnNsaWNlKGlkeCwgaWR4ICsgbGVuKS5qb2luKFwiX1wiKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsobDtlansnYQg7Iic7ZqM7ZWY66mwLCDsuZjtmZgg7Jqp7Ja07KeR7JeQIOyeiOuKlCDri6jslrTqsIAg7Y+s7ZWo65CcIOqyveyasCwg7LmY7ZmYIOyaqeyWtOuhnCDsuZjtmZhcbiAgICAgICAgICBjb25zdCBSRVBMQUNFRF9QUkVGSVggPSBcIiNSRVBMQUNFRC8vXCI7IC8vIOy5mO2ZmOuQnCDri6jslrTrpbwgam9pbiDsnbTtm4Tsl5Drj4Qg7Iud67OE7ZWY6riwIOychO2VtCBwcmVmaXgg7LaU6rCAXG4gICAgICAgICAgbGV0IHJlbWFpbkFycjogc3RyaW5nW10gPSBbLi4ud29yZHNdO1xuICAgICAgICAgIGZvciAoY29uc3QgY29tYiBvZiBjb21iaW5hdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpblN0ciA9IHJlbWFpbkFyci5qb2luKFwiX1wiKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5TdHIuaW5jbHVkZXMoY29tYi53KSAmJiBnbG9zc2FyeS5oYXMoY29tYi53KSkge1xuICAgICAgICAgICAgICByZW1haW5BcnIgPSByZW1haW5TdHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZShjb21iLncsIFJFUExBQ0VEX1BSRUZJWCArIGdsb3NzYXJ5LmdldChjb21iLncpKVxuICAgICAgICAgICAgICAgIC5zcGxpdChcIl9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlbWFpbkFyclxuICAgICAgICAgICAgLm1hcCgocikgPT4ge1xuICAgICAgICAgICAgICBpZiAoci5zdGFydHNXaXRoKFJFUExBQ0VEX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci5yZXBsYWNlKFJFUExBQ0VEX1BSRUZJWCwgXCJcIik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgve0VudGl0eUlEfS9nLCBlbnRpdHlJZCA/IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS50aXRsZSA6IFwiXCIpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiB7IHN1Z2dlc3RlZCB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2VudGl0eS9maW5kTWFueVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gZmxhdHRlblN1YnNldFJvd3Moc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10pOiBGbGF0dGVuU3Vic2V0Um93W10ge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3dzLmZsYXRNYXAoKHN1YnNldFJvdykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjaGlsZHJlbiwgLi4uc1JvdyB9ID0gc3Vic2V0Um93O1xuICAgICAgICAgICAgcmV0dXJuIFtzUm93LCAuLi5mbGF0dGVuU3Vic2V0Um93cyhjaGlsZHJlbildO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50aXRpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0Um93cyA9IGVudGl0eS5nZXRTdWJzZXRSb3dzKCk7XG5cbiAgICAgICAgICAgIC8vIHpvZCDsnbjsiqTthLTsiqTrpbwgc3ByZWFk7ZWY66m0IEpTT04uc3RyaW5naWZ56rCAIHJlZmVyZW5jZeulvCDsnbjrnbzsnbjsnLzroZwg7ZKA7Ja064K066mwIOydkeuLteydtCDsiJjrsLEgTULquYzsp4Ag67aA7ZKA7Ja0IFY4IHN0cmluZyBsaW1pdOulvCDstIjqs7ztlZzri6QuXG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHR5cGVzOiBfdHlwZXMsXG4gICAgICAgICAgICAgIGVudW1zOiBfZW51bXMsXG4gICAgICAgICAgICAgIGVudW1Db25lczogX2VudW1Db25lcyxcbiAgICAgICAgICAgICAgc3Vic2V0Q29uZXM6IF9zdWJzZXRDb25lcyxcbiAgICAgICAgICAgICAgLi4ucmVzdFxuICAgICAgICAgICAgfSA9IGVudGl0eTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgICAgICAgZmxhdHRlblN1YnNldFJvd3M6IGZsYXR0ZW5TdWJzZXRSb3dzKHN1YnNldFJvd3MpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBlbnRpdGllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgYUlkID0gYS5wYXJlbnRJZCA/PyBhLmlkO1xuICAgICAgICAgIGNvbnN0IGJJZCA9IGIucGFyZW50SWQgPz8gYi5pZDtcbiAgICAgICAgICBpZiAoYUlkIDwgYklkKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKGFJZCA+IGJJZCkgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGFJZCA9PT0gYklkKSB7XG4gICAgICAgICAgICBpZiAoYS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAoYi5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGVudGl0aWVzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZmlsdGVyPzogXCJlbnVtc1wiIHwgXCJ0eXBlc1wiO1xuICAgICAgICAgIHJlbG9hZD86IFwiMVwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS90eXBlSWRzXCIsIGFzeW5jIChyZXF1ZXN0KTogUHJvbWlzZTx7IHR5cGVJZHM6IHN0cmluZ1tdIH0+ID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWx0ZXIsIHJlbG9hZCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICBpZiAocmVsb2FkID09PSBcIjFcIikge1xuICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZUlkcyA9ICgoKSA9PiB7XG4gICAgICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoXrk6RcbiAgICAgICAgICBjb25zdCBwcm9qZWN0VHlwZUlkcyA9IE9iamVjdC5lbnRyaWVzKFNvbmFtdS5zeW5jZXIudHlwZXMpXG4gICAgICAgICAgICAuZmlsdGVyKChbX3R5cGVJZCwgem9kVHlwZV0pID0+ICh6b2RUeXBlLl96b2QuZGVmLnR5cGUgYXMgc3RyaW5nKSAhPT0gXCJlbnVtXCIpXG4gICAgICAgICAgICAubWFwKChbdHlwZUlkLCBfem9kVHlwZV0pID0+IHR5cGVJZCk7XG5cbiAgICAgICAgICAvLyDrgrTsnqUg7YOA7J6F65OkIChzb25hbXUg7L2U7Ja07JeQ7IScIOygnOqztSlcbiAgICAgICAgICBjb25zdCBidWlsdEluVHlwZUlkcyA9IFsuLi5CVUlMVF9JTl9UWVBFX0lEU107XG5cbiAgICAgICAgICAvLyDrqqjrk6Ag7YOA7J6FIOuzke2VqVxuICAgICAgICAgIGNvbnN0IGFsbFR5cGVJZHMgPSBbLi4uYnVpbHRJblR5cGVJZHMsIC4uLnByb2plY3RUeXBlSWRzXTtcblxuICAgICAgICAgIGlmIChmaWx0ZXIgPT09IFwidHlwZXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIGFsbFR5cGVJZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW51bUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkuZmxhdE1hcCgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVscyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyID09PSBcImVudW1zXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnVtSWRzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWy4uLmFsbFR5cGVJZHMsIC4uLmVudW1JZHNdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGVJZHMsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZm9ybToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZvcm0gfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7IC4uLmZvcm0sIGVudGl0eUlkOiBmb3JtLmlkIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIHJldHVybiBhd2FpdCBTb25hbXUuc3luY2VyLmRlbEVudGl0eShlbnRpdHlJZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3VmFsdWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogc3RyaW5nO1xuICAgICAgICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgICAgICAgIHBhcmVudElkPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUVudGl0eUJhc2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIG5ld1ZhbHVlcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkudGl0bGUgPSBuZXdWYWx1ZXMudGl0bGU7XG4gICAgICAgICAgZW50aXR5LnRhYmxlID0gbmV3VmFsdWVzLnRhYmxlO1xuICAgICAgICAgIGVudGl0eS5wYXJlbnRJZCA9IG5ld1ZhbHVlcy5wYXJlbnRJZDtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgc3Vic2V0S2V5OiBzdHJpbmc7XG4gICAgICAgICAgZmllbGRzOiBzdHJpbmdbXTtcbiAgICAgICAgICBmaWVsZHNJbnRlcm5hbD86IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlTdWJzZXRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHN1YnNldEtleSwgZmllbGRzLCBmaWVsZHNJbnRlcm5hbCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gZmllbGRzO1xuICAgICAgICAgIGlmIChmaWVsZHNJbnRlcm5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRzSW50ZXJuYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPSBmaWVsZHNJbnRlcm5hbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4geyB1cGRhdGVkOiBmaWVsZHMsIHVwZGF0ZWRJbnRlcm5hbDogZmllbGRzSW50ZXJuYWwgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsU3Vic2V0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBzdWJzZXRLZXkgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3UHJvcDogRW50aXR5UHJvcDtcbiAgICAgICAgICBhdD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlUHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQsIG5ld1Byb3AgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LmNyZWF0ZVByb3AobmV3UHJvcCwgYXQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld1Byb3A6IEVudGl0eVByb3A7XG4gICAgICAgICAgYXQ6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5UHJvcFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgYXQsIG5ld1Byb3AgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkubW9kaWZ5UHJvcChuZXdQcm9wLCBhdCk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5kZWxQcm9wKGF0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICAgIHRvOiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vdmVQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgdG8gfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkubW92ZVByb3AoYXQsIHRvKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeUluZGV4ZXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGluZGV4ZXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmluZGV4ZXMgPSBpbmRleGVzO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4geyB1cGRhdGVkOiBpbmRleGVzIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUxhYmVsczogRW50aXR5W1wiZW51bUxhYmVsc1wiXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW51bUxhYmVsc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZW51bUxhYmVscyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9IGVudW1MYWJlbHM7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGVudW1MYWJlbHMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdFbnVtSWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvY3JlYXRlRW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBuZXdFbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICBpZiAoZW50aXR5LmVudW1MYWJlbHNbbmV3RW51bUlkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnbTrr7gg7KG07J6s7ZWY64qUIGVudW1JZOyeheuLiOuLpDogJHtuZXdFbnVtSWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHNbbmV3RW51bUlkXSA9IG5ld0VudW1JZC5lbmRzV2l0aChcIlN0YXR1c1wiKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgYWN0aXZlOiBcIuuFuOy2nFwiLFxuICAgICAgICAgICAgICAgIGhpZGRlbjogXCLsiKjquYBcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgXCJcIjogXCJcIixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkOiB7XG4gICAgICAgICAgICBiZWZvcmU6IHN0cmluZztcbiAgICAgICAgICAgIGFmdGVyOiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgICAgIGNvbnN0IGlzRXhpc3RzID0gZW50aXR5SWRzLnNvbWUoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmluY2x1ZGVzKGVudW1JZC5hZnRlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOydtOuvuCDsobTsnqztlZjripQgRW51bUlk7J6F64uI64ukOiAke2VudW1JZC5hZnRlcn1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmFmdGVyXSA9IGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5iZWZvcmVdO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYmVmb3JlXTtcblxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIGVudGl0eUlkcykge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICAgICAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiAmJiBwcm9wLmlkID09PSBlbnVtSWQuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgcHJvcC5pZCA9IGVudW1JZC5hZnRlcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbGV0ZUVudW1JZFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgZW51bUlkIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlZCA9IGVudGl0eUlkc1xuICAgICAgICAgICAgLmZsYXRNYXAoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMpXG4gICAgICAgICAgICAuc29tZSgocHJvcCkgPT4gcHJvcC50eXBlID09PSBcImVudW1cIiAmJiBwcm9wLmlkID09PSBlbnVtSWQpO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnVtSWR966W8IOywuOyhsO2VmOuKlCDtlITroZztjbzti7DqsIAg7KG07J6s7ZWp64uI64ukLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LmVudW1MYWJlbHNbZW51bUlkXTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHRhcmdldDogXCJlbnRpdHlcIiB8IFwicHJvcFwiIHwgXCJlbnVtXCIgfCBcInN1YnNldFwiO1xuICAgICAgICAgIHByb3BOYW1lPzogc3RyaW5nO1xuICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk/OiBzdHJpbmc7XG4gICAgICAgICAgY29uZTogQ29uZTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvdXBkYXRlQ29uZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgdGFyZ2V0LCBwcm9wTmFtZSwgZW51bUlkLCBzdWJzZXRLZXksIGNvbmUgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0ID09PSBcImVudGl0eVwiKSB7XG4gICAgICAgICAgICBlbnRpdHkuY29uZSA9IGNvbmU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IFwicHJvcFwiICYmIHByb3BOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gXCJlbnVtXCIgJiYgZW51bUlkKSB7XG4gICAgICAgICAgICBlbnRpdHkuZW51bUNvbmVzW2VudW1JZF0gPSBjb25lO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBcInN1YnNldFwiICYmIHN1YnNldEtleSkge1xuICAgICAgICAgICAgZW50aXR5LnN1YnNldENvbmVzW3N1YnNldEtleV0gPSBjb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgICAgICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICAgICAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2dlbmVyYXRlQ29uZXNcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBwcmVzZXJ2ZUV4aXN0aW5nLCBvbmx5RW1wdHksIGxvY2FsZSB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVudGl0eSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAgICAgICAvLyBsb2NhbGUg6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDsgqzsmqlcbiAgICAgICAgICAgIGNvbnN0IGVmZmVjdGl2ZUxvY2FsZSA9XG4gICAgICAgICAgICAgIGxvY2FsZSA/PyAoU29uYW11LmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGUgYXMgXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTtcblxuICAgICAgICAgICAgLy8gQ29uZSDsg53shLFcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogcHJlc2VydmVFeGlzdGluZyA/PyB0cnVlLFxuICAgICAgICAgICAgICBvbmx5RW1wdHk6IG9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgbG9jYWxlOiBlZmZlY3RpdmVMb2NhbGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblxuICAgICAgICAgICAgLy8gRW50aXR5IG5vdCBmb3VuZFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCLsobTsnqztlZjsp4Ag7JWK64qUIEVudGl0eVwiKSkge1xuICAgICAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQVBJIO2CpCDsl4bsnYxcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVkgbm90IGZvdW5kXCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBcIkFQSSBrZXkgbm90IGNvbmZpZ3VyZWRcIixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmF0ZSBsaW1pdFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJSYXRlIGxpbWl0IGV4Y2VlZGVkXCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MjkpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBcIlJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIOq4sO2DgCDsl5Drn6xcbiAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIGVycm9yOiBgQ29uZSBnZW5lcmF0aW9uIGZhaWxlZDogJHttZXNzYWdlfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZ2V0VGFibGVDb2x1bW5zXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWQgfSA9IHJlcXVlc3QucXVlcnk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IGVudGl0eS5nZXRUYWJsZUNvbHVtbnMoKTtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1ucyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgYWN0aW9uOiBcImFwcGx5XCIgfCBcInJvbGxiYWNrXCIgfCBcInNoYWRvd1wiO1xuICAgICAgICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICAgICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICAgICAgZm9yY2VSZWFzb24/OiBzdHJpbmc7XG4gICAgICAgICAgcmVxdWVzdG9yPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXG4gICAgICAgIFwiL2FwaS9taWdyYXRpb25zL3J1bkFjdGlvblwiLFxuICAgICAgICBhc3luYyAocmVxdWVzdCk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdD4gPT4ge1xuICAgICAgICAgIGNvbnN0IHsgYWN0aW9uLCB0YXJnZXRzLCBmb3JjZSwgZm9yY2VSZWFzb24sIHJlcXVlc3RvciB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gXCJzaGFkb3dcIikge1xuICAgICAgICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTbGFjayDsirnsnbgg7LK07YGsIChhcHBseSDsi5zsl5Drp4wpXG4gICAgICAgICAgaWYgKGFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0KSA9PiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHQpKTtcblxuICAgICAgICAgICAgLy8g66Gc7LusIERC7J24IOqyveyasCDsirnsnbgg7Iqk7YK1XG4gICAgICAgICAgICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgICAgICAgICAgIGNvbnN0IGlzTG9jYWxUYXJnZXQgPSB0YXJnZXRzLmV2ZXJ5KCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q29uZmlnID0gU29uYW11LmRiQ29uZmlnW3RhcmdldF07XG4gICAgICAgICAgICAgIGNvbnN0IGhvc3QgPSAodGFyZ2V0Q29uZmlnPy5jb25uZWN0aW9uIGFzIHsgaG9zdD86IHN0cmluZyB9KT8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgICAgICAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1aXJlc0FwcHJvdmFsICYmIHNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSAmJiAhaXNMb2NhbFRhcmdldCkge1xuICAgICAgICAgICAgICBjb25zdCB7IGNvbm5zIH0gPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcblxuICAgICAgICAgICAgICAvLyDrqqjrk6Ag7YOA6rKfIERC7JeQ7IScIHBlbmRpbmfsnbgg66eI7J206re466CI7J207IWY7J2YIO2Vqeynke2VqeydhCDqtaztlanri4jri6QuXG4gICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdNaWdyYXRpb25zID0gW1xuICAgICAgICAgICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICBjb25uc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChjb25uKSA9PiB0YXJnZXRzLmluY2x1ZGVzKGNvbm4uY29ubktleSkpXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChjb25uKSA9PiBjb25uLnBlbmRpbmcpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmdNaWdyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyDquLDsobQg7Iq57J24IOyalOyyrSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHNsYWNrQ29uZmlybS5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZ01pZ3JhdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAvLyDquLDsobQg7JqU7LKt7J20IOyeiOycvOuptCDsirnsnbgg7IOB7YOcIO2ZleyduFxuICAgICAgICAgICAgICAgICAgY29uc3QgeyBhcHByb3ZlZCwgcmVqZWN0ZWQgfSA9IGF3YWl0IHNsYWNrQ29uZmlybS5jaGVja0FwcHJvdmFsKFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChhcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyDsirnsnbjrkKgg4oaSIOyLpO2WiVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmxvZ0V4ZWN1dGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2Ug7KeE7ZaJXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5mb3JjZUFwcHJvdmFsKFxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcudHMsXG4gICAgICAgICAgICAgICAgICAgICAgZm9yY2VSZWFzb24gPz8gXCLsgqzsnKAg7JeG7J2MXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmxvZ0V4ZWN1dGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyDrjIDquLDspJFcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiBleGlzdGluZy5jaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICAgIHRzOiBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8g7IOIIOyKueyduCDsmpTssq0g67Cc7IahXG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzIH0gPSBhd2FpdCBzbGFja0NvbmZpcm0ucG9zdEFwcHJvdmFsUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pZ3JhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RvcixcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uc2F2ZVJlcXVlc3QocGVuZGluZ01pZ3JhdGlvbnMsIGNoYW5uZWwsIHRzKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwZW5kaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIHRzLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbWlncmF0b3IucnVuQWN0aW9uKGFjdGlvbiwgdGFyZ2V0cyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICAgICAgdHM6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2NoZWNrQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG5cbiAgICAgICAgaWYgKCFzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICByZXR1cm4geyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2xhY2tDb25maXJtLmNoZWNrQXBwcm92YWwoY2hhbm5lbCwgdHMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNoYW5uZWw6IHN0cmluZztcbiAgICAgICAgICB0czogc3RyaW5nO1xuICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjaGFubmVsLCB0cywgcmVhc29uLCByZXF1ZXN0b3IgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuXG4gICAgICAgIGlmICghc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0uZm9yY2VBcHByb3ZhbChjaGFubmVsLCB0cywgcmVhc29uLCByZXF1ZXN0b3IpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY29kZU5hbWVzOiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9taWdyYXRpb25zL2RlbENvZGVzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29kZU5hbWVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiBhd2FpdCBtaWdyYXRvci5kZWxDb2Rlcyhjb2RlTmFtZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL2dlbmVyYXRlUHJlcGFyZWRDb2Rlc1wiLCBhc3luYyAoX3JlcXVlc3R0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBtaWdyYXRvci5nZW5lcmF0ZVByZXBhcmVkQ29kZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIHRlbXBsYXRlS2V5czogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc2NhZmZvbGRpbmcvZ2V0U3RhdHVzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5SWRzLCB0ZW1wbGF0ZUtleXM6IF90ZW1wbGF0ZUtleXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgaWYgKChlbnRpdHlJZHMgPz8gW10pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmVudGl0eUlkc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICgoX3RlbXBsYXRlS2V5cyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IudGVtcGxhdGVLZXlzUmVxdWlyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29ydGluZ1xuICAgICAgICBlbnRpdHlJZHMuc29ydCgoYSwgYikgPT4gKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKSk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlS2V5cyA9IFRlbXBsYXRlS2V5Lm9wdGlvbnMuZmlsdGVyKCh0aykgPT4gX3RlbXBsYXRlS2V5cy5pbmNsdWRlcyh0aykpO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmF0aW9ucyA9IGVudGl0eUlkcy5mbGF0TWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZUtleXMubWFwKCh0ZW1wbGF0ZUtleSkgPT4gW2VudGl0eUlkLCB0ZW1wbGF0ZUtleV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGNvbWJpbmF0aW9ucy5tYXAoYXN5bmMgKFtlbnRpdHlJZCwgdGVtcGxhdGVLZXldKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN1YlBhdGgsIGZ1bGxQYXRoLCBpc0V4aXN0cyB9ID0gYXdhaXQgU29uYW11LnN5bmNlci5jaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgdGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgIHN1YlBhdGgsXG4gICAgICAgICAgICAgIGZ1bGxQYXRoLFxuICAgICAgICAgICAgICBpc0V4aXN0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1c2VzIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5OiBzdHJpbmc7XG4gICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICBvdmVyd3JpdGU/OiBib29sZWFuO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9nZW5lcmF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iub3B0aW9uc1JlcXVpcmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIOuqqOuToCDthZztlIzrpr/sl5DshJwg7ZWE7JqU7ZWcIGRpY3Qg7YKk66W8IOyImOynkVxuICAgICAgICBjb25zdCBrZXlzID0gb3B0aW9ucy5mbGF0TWFwKCh7IHRlbXBsYXRlS2V5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5nZXRSZXF1aXJlZERpY3RLZXlzKCkgPz8gW107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDIuIHRhcmdldOuzhOuhnCBlbnN1cmVEaWN0S2V5cyDtmLjstpwgKOyInOywqCDsspjrpqwpXG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZW5zdXJlRGljdEtleXMoWy4uLm5ldyBTZXQoa2V5cyldKTtcblxuICAgICAgICAvLyAzLiDthZztlIzrpr8g7IOd7ISxICjrs5HroKwg7LKY66asKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBvcHRpb25zLm1hcChhc3luYyAoeyBlbnRpdHlJZCwgdGVtcGxhdGVLZXksIGVudW1JZCwgb3ZlcndyaXRlIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgYXMgVGVtcGxhdGVLZXksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlbnVtSWQsXG4gICAgICAgICAgICAgICAgfSBhcyB7XG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmIChpc1NvRXhjZXB0aW9uKGUpICYmIGUuc3RhdHVzQ29kZSA9PT0gNTQxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5maWx0ZXIobm9uTnVsbGFibGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuYWxsRmlsZXNHZW5lcmF0ZWRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgb3B0aW9uOiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdGVtcGxhdGVLZXk6IHN0cmluZztcbiAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL3ByZXZpZXdcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgcGF0aEFuZENvZGVzOiBQYXRoQW5kQ29kZVtdIH0+ID0+IHtcbiAgICAgICAgY29uc3QgeyBvcHRpb24gfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgdGVtcGxhdGVLZXksIC4uLnRlbXBsYXRlT3B0aW9ucyB9ID0gb3B0aW9uO1xuICAgICAgICAgIGNvbnN0IHBhdGhBbmRDb2RlcyA9IGF3YWl0IFNvbmFtdS5zeW5jZXIucmVuZGVyVGVtcGxhdGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgIHRlbXBsYXRlT3B0aW9ucyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHsgcGF0aEFuZENvZGVzIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayB9ID0gcmVxdWVzdC5ib2R5IGFzIHtcbiAgICAgICAgICBzb3VyY2VEQjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgdGFyZ2V0REI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIHNlYXJjaDogRml4dHVyZVNlYXJjaE9wdGlvbnM7XG4gICAgICAgICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnM7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmdldEZpeHR1cmVzKHNvdXJjZURCLCB0YXJnZXREQiwgc2VhcmNoLCBkdXBsaWNhdGVDaGVjayk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmUvaW1wb3J0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGIsIGZpeHR1cmVzIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuICAgICAgICAgIGRiOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyhkYiwgZml4dHVyZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlL2FkZEZpeHR1cmVMb2FkZXJcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlIH0gPSByZXF1ZXN0LmJvZHkgYXMgeyBjb2RlOiBzdHJpbmcgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuYWRkRml4dHVyZUxvYWRlcihjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9pMThuL2RpY3Rpb25hcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvaTE4bi9leHBvcnRcIiwgYXN5bmMgKF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVuYW1lLCBidWZmZXIgfSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZXhwb3J0VG9FeGNlbCgpO1xuICAgICAgICByZXBseVxuICAgICAgICAgIC5oZWFkZXIoXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLFxuICAgICAgICAgIClcbiAgICAgICAgICAuaGVhZGVyKFwiQ29udGVudC1EaXNwb3NpdGlvblwiLCBgYXR0YWNobWVudDsgZmlsZW5hbWU9XCIke2ZpbGVuYW1lfVwiYClcbiAgICAgICAgICAuc2VuZChidWZmZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9pMThuL2ltcG9ydFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdC5maWxlKCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLmZpbGVOb3RVcGxvYWRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZGF0YS50b0J1ZmZlcigpO1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5pbXBvcnRGcm9tRXhjZWwoYnVmZmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvbGRLZXk6IHN0cmluZztcbiAgICAgICAgICBuZXdLZXk6IHN0cmluZztcbiAgICAgICAgICBzb3VyY2U6IFwiZW50aXR5XCIgfCBcInByb2plY3RcIiB8IFwic29uYW11XCI7XG4gICAgICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vdXBkYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkudXBkYXRlRW50cnkocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2NyZWF0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmNyZWF0ZUVudHJ5KHJlcXVlc3QuYm9keSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9pMThuL2RlbGV0ZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmRlbGV0ZUVudHJ5KHJlcXVlc3QuYm9keS5rZXkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGtleXM6IHN0cmluZ1tdIH0gfT4oXCIvYXBpL2kxOG4vY2hlY2tVc2FnZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jaGVja1VzYWdlKHJlcXVlc3QuYm9keS5rZXlzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUYXNrcyBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3Rhc2tzL3N0YXR1c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgU29uYW11LndvcmtmbG93cztcbiAgICAgICAgICByZXR1cm4geyBhY3RpdmU6IHRydWUgfTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvdGFza3Mvd29ya2Zsb3dEZWZpbml0aW9uc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb25zID0gU29uYW11LndvcmtmbG93cy53b3JrZmxvd0RlZmluaXRpb25zO1xuICAgICAgICByZXR1cm4geyBkZWZpbml0aW9ucyB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBRdWVyeXN0cmluZzoge1xuICAgICAgICAgIGxpbWl0Pzogc3RyaW5nO1xuICAgICAgICAgIGFmdGVyPzogc3RyaW5nO1xuICAgICAgICAgIGJlZm9yZT86IHN0cmluZztcbiAgICAgICAgICBvcmRlcj86IFwiYXNjXCIgfCBcImRlc2NcIjtcbiAgICAgICAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgIGNyZWF0ZWRBZnRlcj86IHN0cmluZztcbiAgICAgICAgICBjcmVhdGVkQmVmb3JlPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVuc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICBjb25zdCB7IGxpbWl0LCBhZnRlciwgYmVmb3JlLCBvcmRlciwgc3RhdHVzLCB3b3JrZmxvd05hbWUsIGNyZWF0ZWRBZnRlciwgY3JlYXRlZEJlZm9yZSB9ID1cbiAgICAgICAgICByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICByZXR1cm4gYmFja2VuZC5saXN0V29ya2Zsb3dSdW5zKHtcbiAgICAgICAgICBsaW1pdDogbGltaXQgPyBOdW1iZXIucGFyc2VJbnQobGltaXQsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhZnRlcixcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPyBzdGF0dXMuc3BsaXQoXCIsXCIpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBjcmVhdGVkQWZ0ZXI6IGNyZWF0ZWRBZnRlciA/IG5ldyBEYXRlKGNyZWF0ZWRBZnRlcikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY3JlYXRlZEJlZm9yZTogY3JlYXRlZEJlZm9yZSA/IG5ldyBEYXRlKGNyZWF0ZWRCZWZvcmUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93UnVuID0gYXdhaXQgYmFja2VuZC5nZXRXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZmxvdyBydW4gbm90IGZvdW5kOiAke3JlcXVlc3QucGFyYW1zLmlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JrZmxvd1J1bjtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9jYW5jZWxcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQuY2FuY2VsV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9wYXVzZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5wYXVzZVdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvcmVzdW1lXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLnJlc3VtZVdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgbGltaXQ/OiBzdHJpbmc7XG4gICAgICAgICAgYWZ0ZXI/OiBzdHJpbmc7XG4gICAgICAgICAgYmVmb3JlPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWQvc3RlcHNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgY29uc3QgeyBsaW1pdCwgYWZ0ZXIsIGJlZm9yZSB9ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQubGlzdFN0ZXBBdHRlbXB0cyh7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgICAgbGltaXQ6IGxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KGxpbWl0LCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYWZ0ZXIsXG4gICAgICAgICAgYmVmb3JlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEhlYWx0aCBDaGVjayBBUElcbiAgICAgICAqIE1DUCDrj4TqtazqsIAgU29uYW11IOyEnOuyhOulvCDsnpDrj5kg6rCQ7KeA7ZWY6riwIOychO2VnCDsl5Trk5ztj6zsnbjtirhcbiAgICAgICAqL1xuICAgICAgc2VydmVyLmdldChcIi9hcGkvc29uYW11L2hlYWx0aFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gcmVxdWVzdC5zZXJ2ZXIuc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IGFkZHJlc3MgJiYgdHlwZW9mIGFkZHJlc3MgPT09IFwib2JqZWN0XCIgPyBhZGRyZXNzLnBvcnQgOiAwO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgcHJvamVjdDogcHJvY2Vzcy5jd2QoKS5zcGxpdChcIi9cIikucG9wKCkgfHwgXCJ1bmtub3duXCIsXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg7IOd7ISxIEFQSVxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBjb3VudD86IG51bWJlcjtcbiAgICAgICAgICBvdmVycmlkZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB0YXJnZXREYj86IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvZ2VuZXJhdGVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5LCBjb3VudCA9IDEsIG92ZXJyaWRlcywgdGFyZ2V0RGIgPSBcImZpeHR1cmVcIiB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIC8vIO2DgOqynyBEQiDshKTsoJUg6rCA7KC47Jik6riwXG4gICAgICAgIGNvbnN0IGRiQ29uZmlnID0gdGFyZ2V0RGIgPT09IFwiZml4dHVyZVwiID8gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUgOiBTb25hbXUuZGJDb25maWcudGVzdDtcblxuICAgICAgICAvLyBLbmV4IOyduOyKpO2EtOyKpCDsg53shLFcbiAgICAgICAgY29uc3QgZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoZGJDb25maWcpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRml4dHVyZUdlbmVyYXRvciDsg53shLFcbiAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihkYiwgZGIsIHRhcmdldERiLCBFbnRpdHlNYW5hZ2VyKTtcblxuICAgICAgICAgIC8vIOuLqOydvCBFbnRpdHkg67Cw7LmYIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGZpeHR1cmVzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICBvdmVycmlkZXM6IG92ZXJyaWRlcyA/PyB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIGNvdW50OiBmaXh0dXJlcy5sZW5ndGgsXG4gICAgICAgICAgICBmaXh0dXJlcyxcbiAgICAgICAgICAgIHRhcmdldERiLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogRml4dHVyZSDrjbDsnbTthLAg7YOQ7IOJIEFQSVxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneTogXCJzYW1wbGVcIiB8IFwicmVjZW50XCIgfCBcInJhbmRvbVwiIHwgXCJxdWVyeVwiO1xuICAgICAgICAgIGxpbWl0PzogbnVtYmVyO1xuICAgICAgICAgIHdoZXJlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvZXhwbG9yZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHksIHN0cmF0ZWd5LCBsaW1pdCA9IDEwLCB3aGVyZSB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIC8vIEZpeHR1cmUgREIg7ISk7KCVIOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCBmaXh0dXJlRGJDb25maWcgPSBTb25hbXUuZGJDb25maWcuZml4dHVyZTtcblxuICAgICAgICAvLyBLbmV4IOyduOyKpO2EtOyKpCDsg53shLFcbiAgICAgICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKGZpeHR1cmVEYkNvbmZpZyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBEYXRhRXhwbG9yZXIg7IOd7ISxXG4gICAgICAgICAgY29uc3QgZXhwbG9yZXIgPSBuZXcgRGF0YUV4cGxvcmVyKGZpeHR1cmVEYiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZXhwbG9yZXIuZXhwbG9yZShlbnRpdHksIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBjb3VudDogZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIOqwgOyguOyYpOq4sCAoZmV0Y2gpIEFQSVxuICAgICAgICogcHJvZHVjdGlvbi9kZXZlbG9wbWVudCBEQuyXkOyEnCDsi6TsoJwg642w7J207YSw66W8IGZpeHR1cmUgRELroZwgaW1wb3J0XG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eTogc3RyaW5nO1xuICAgICAgICAgIHN0cmF0ZWd5PzogXCJzYW1wbGVcIiB8IFwicmVjZW50XCIgfCBcInJhbmRvbVwiIHwgXCJxdWVyeVwiO1xuICAgICAgICAgIGxpbWl0PzogbnVtYmVyO1xuICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnM/OiBib29sZWFuO1xuICAgICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2ZldGNoXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZW50aXR5LFxuICAgICAgICAgIHN0cmF0ZWd5ID0gXCJyZWNlbnRcIixcbiAgICAgICAgICBsaW1pdCA9IDEwLFxuICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnMgPSB0cnVlLFxuICAgICAgICAgIG1heERlcHRoID0gMixcbiAgICAgICAgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBTb3VyY2UgREIgKHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQpIC0g7J296riwIOyghOyaqVxuICAgICAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTtcblxuICAgICAgICAvLyBUYXJnZXQgREIgKGZpeHR1cmUpXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGaXh0dXJlR2VuZXJhdG9yIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IG5ldyBGaXh0dXJlR2VuZXJhdG9yKHNvdXJjZURiLCBmaXh0dXJlRGIsIFwiZml4dHVyZVwiLCBFbnRpdHlNYW5hZ2VyKTtcblxuICAgICAgICAgIC8vIHByb2R1Y3Rpb24g642w7J207YSw66W8IGZpeHR1cmUgRELroZwgaW1wb3J0XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eSwge1xuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnMsXG4gICAgICAgICAgICBtYXhEZXB0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICBjb3VudDogcmVzdWx0cy5sZW5ndGgsXG4gICAgICAgICAgICBpbXBvcnRlZDogcmVzdWx0cyxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBzb3VyY2VEYuuKlCBTb25hbXXqsIAg6rSA66as7ZWY66+A66GcIGRlc3Ryb3ntlZjsp4Ag7JWK7J2MXG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogRml4dHVyZSDrjbDsnbTthLAg7IKt7KCcIChjbGVhbikgQVBJXG4gICAgICAgKiBGSyDsiJzshJzrpbwg6rOg66Ck7ZWY7JesIOyViOyghO2VmOqyjCDsgq3soJxcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXRpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9jbGVhblwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdGllcyB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIC8vIEZpeHR1cmUgREIg7Jew6rKwXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDsgq3soJztlaAgRW50aXR5IOuqqeuhnSDqsrDsoJVcbiAgICAgICAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9XG4gICAgICAgICAgICBlbnRpdGllcyAmJiBlbnRpdGllcy5sZW5ndGggPiAwID8gZW50aXRpZXMgOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgICAgICAgLy8gRW50aXR5IElE66W8IO2FjOydtOu4lOuqheycvOuhnCDrs4DtmZggKHNuYWtlX2Nhc2Ug67O17IiY7ZiVKVxuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXMgPSB0YXJnZXRFbnRpdGllcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5LnRhYmxlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gUG9zdGdyZVNRTDogVFJVTkNBVEUgQ0FTQ0FEReuhnCBGSyDsiJzshJwg66y06rSA7ZWY6rKMIOyViOyghO2VmOqyjCDsgq3soJxcbiAgICAgICAgICAvLyBDQVNDQURFIOyYteyFmOycvOuhnCDsnZjsobTshLEg7J6I64qUIOuNsOydtO2EsOuPhCDtlajqu5gg7IKt7KCcXG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLnJhdyhcbiAgICAgICAgICAgIGBUUlVOQ0FURSBUQUJMRSAke3RhYmxlTmFtZXMubWFwKCh0KSA9PiBgXCIke3R9XCJgKS5qb2luKFwiLCBcIil9IFJFU1RBUlQgSURFTlRJVFkgQ0FTQ0FERWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgY2xlYW5lZDogdGFibGVOYW1lcyxcbiAgICAgICAgICAgIGNvdW50OiB0YWJsZU5hbWVzLmxlbmd0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBmaXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ0REIEFQSVxuICAgICAgc2VydmVyLmdldChcIi9hcGkvY2RkL3RyZWVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q2RkVHJlZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogeyBmaWxlUGF0aDogc3RyaW5nIH0gfT4oXCIvYXBpL2NkZC9yZWFkQ29udGVudFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGVudChmaWxlUGF0aCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGZpbGVQYXRoOiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL2VkaXRDb250ZW50XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsZVBhdGggfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIGVkaXRDb250ZW50KGZpbGVQYXRoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgZmlsZVBhdGg6IHN0cmluZyB9IH0+KFwiL2FwaS9jZGQvb3BlblNvdXJjZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIG9wZW5Tb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENERCBSdWxlcyBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2NkZC9ydWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBsaXN0UnVsZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgcnVsZUtleTogc3RyaW5nIH0gfT4oXCIvYXBpL2NkZC9yZWFkUnVsZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJ1bGVLZXkgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIHJlYWRSdWxlKHJ1bGVLZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogQ2RkQWRkUnVsZVJlcXVlc3QgfT4oXCIvYXBpL2NkZC9hZGRSdWxlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhZGRSdWxlKHJlcXVlc3QuYm9keSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ0REIEFDIEFQSVxuICAgICAgc2VydmVyLmdldChcIi9hcGkvY2RkL2FjXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEFjTGlzdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHVpLXdlYiDruYzrk5wg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgdWlEaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uL3VpLXdlYlwiKTtcblxuICAgICAgLy8g7KCV7KCBIO2MjOydvCDshJzruZk6IOujqO2KuCDtj7TrjZQg7KCE7LK0IChhc3NldHMsIHNldHRpbmcuc3ZnIOuTsSlcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9zdGF0aWNcIiksIHtcbiAgICAgICAgcm9vdDogdWlEaXN0UGF0aCxcbiAgICAgICAgcHJlZml4OiBcIi9cIixcbiAgICAgICAgZGVjb3JhdGVSZXBseTogZmFsc2UsXG4gICAgICAgIHdpbGRjYXJkOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTUEEgZmFsbGJhY2sgLSDsoJXsoIEg7YyM7J287J20IOyXhuuKlCDrqqjrk6Ag6rK966Gc64qUIGluZGV4Lmh0bWzroZxcbiAgICAgIHNlcnZlci5nZXQoXCIqXCIsIGFzeW5jIChfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgcmVwbHkuaGVhZGVycyh7IFwiQ29udGVudC10eXBlXCI6IFwidGV4dC9odG1sXCIgfSkuc2VuZChcbiAgICAgICAgICBmc1xuICAgICAgICAgICAgLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUodWlEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpKVxuICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3twcm9qZWN0TmFtZX19XCIsIFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJVbmtub3duU29uYW11UHJvamVjdFwiKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgeyBwcmVmaXg6IFwiL3NvbmFtdS11aVwiIH0sXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQSxlQUFzQixrQkFBa0IsU0FBMEI7Q0FDaEUsUUFBUSxTQUNOLE9BQU8sV0FBVztFQUVoQixNQUFNLFdBQVcsSUFBSSxTQUFTO0VBRzlCLGVBQWUsb0JBQXVCLElBQWtDO0dBQ3RFLE1BQU0sY0FBYyxJQUFJLFNBQWUsWUFBWTtJQUNqRCxNQUFNLGdCQUFnQjtLQUNwQixhQUFhLE9BQU87S0FDcEIsUUFBUTtJQUNWO0lBRUEsTUFBTSxVQUFVLGlCQUFpQjtLQUMvQixPQUFPLE9BQU8sYUFBYSxJQUFJLGtCQUFrQixPQUFPO0tBQ3hELFFBQVE7SUFDVixHQUFHLElBQUk7SUFFUCxPQUFPLE9BQU8sYUFBYSxLQUFLLGtCQUFrQixPQUFPO0dBQzNELENBQUM7R0FFRCxNQUFNLFNBQVMsTUFBTSxHQUFHO0dBQ3hCLE1BQU07R0FDTixPQUFPO0VBQ1Q7RUFFQSxNQUFNLFNBQVMsTUFBTTtFQUVyQixPQUFPLElBQUksc0JBQXNCLFlBQVk7R0FDM0MsT0FBTyxPQUFPO0VBQ2hCLENBQUM7RUFFRCxPQUFPLElBTUoseUJB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