semantifold 0.3.0 → 0.4.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 (297) hide show
  1. package/README.md +58 -15
  2. package/build/index.d.ts +48 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +57 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/c-validation.d.ts.map +1 -1
  11. package/build/src/backends/c-validation.js +7 -3
  12. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  13. package/build/src/backends/cpp-validation.js +7 -3
  14. package/build/src/backends/csharp.js +7 -1
  15. package/build/src/backends/dart-runtime.d.ts +2 -0
  16. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  17. package/build/src/backends/dart-runtime.js +41 -0
  18. package/build/src/backends/dart.d.ts +20 -0
  19. package/build/src/backends/dart.d.ts.map +1 -0
  20. package/build/src/backends/dart.js +321 -0
  21. package/build/src/backends/effects.d.ts +60 -0
  22. package/build/src/backends/effects.d.ts.map +1 -0
  23. package/build/src/backends/effects.js +746 -0
  24. package/build/src/backends/go.js +18 -4
  25. package/build/src/backends/identifiers.d.ts +36 -4
  26. package/build/src/backends/identifiers.d.ts.map +1 -1
  27. package/build/src/backends/identifiers.js +154 -10
  28. package/build/src/backends/index.d.ts.map +1 -1
  29. package/build/src/backends/index.js +27 -4
  30. package/build/src/backends/ios.d.ts +68 -0
  31. package/build/src/backends/ios.d.ts.map +1 -0
  32. package/build/src/backends/ios.js +1503 -0
  33. package/build/src/backends/java.d.ts.map +1 -1
  34. package/build/src/backends/java.js +429 -36
  35. package/build/src/backends/javascript.d.ts +6 -0
  36. package/build/src/backends/javascript.d.ts.map +1 -1
  37. package/build/src/backends/javascript.js +380 -24
  38. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  39. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  40. package/build/src/backends/kotlin-runtime.js +29 -0
  41. package/build/src/backends/kotlin.d.ts +23 -0
  42. package/build/src/backends/kotlin.d.ts.map +1 -0
  43. package/build/src/backends/kotlin.js +136 -0
  44. package/build/src/backends/native-validation.d.ts +2 -2
  45. package/build/src/backends/native-validation.d.ts.map +1 -1
  46. package/build/src/backends/native-validation.js +2 -2
  47. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  48. package/build/src/backends/ordered-expressions.js +39 -7
  49. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  50. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  51. package/build/src/backends/php-stdlib-support.js +227 -0
  52. package/build/src/backends/php.d.ts.map +1 -1
  53. package/build/src/backends/php.js +448 -33
  54. package/build/src/backends/program.d.ts +81 -0
  55. package/build/src/backends/program.d.ts.map +1 -0
  56. package/build/src/backends/program.js +1308 -0
  57. package/build/src/backends/python.js +7 -1
  58. package/build/src/backends/ruby.d.ts.map +1 -1
  59. package/build/src/backends/ruby.js +310 -24
  60. package/build/src/backends/rust-runtime.d.ts +7 -0
  61. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  62. package/build/src/backends/rust-runtime.js +32 -0
  63. package/build/src/backends/rust-validation.d.ts +9 -0
  64. package/build/src/backends/rust-validation.d.ts.map +1 -0
  65. package/build/src/backends/rust-validation.js +78 -0
  66. package/build/src/backends/rust.d.ts +24 -0
  67. package/build/src/backends/rust.d.ts.map +1 -0
  68. package/build/src/backends/rust.js +344 -0
  69. package/build/src/backends/scalars.d.ts +14 -6
  70. package/build/src/backends/scalars.d.ts.map +1 -1
  71. package/build/src/backends/scalars.js +167 -17
  72. package/build/src/backends/shared.d.ts +23 -4
  73. package/build/src/backends/shared.d.ts.map +1 -1
  74. package/build/src/backends/shared.js +2158 -62
  75. package/build/src/backends/stdlib-support.d.ts +14 -0
  76. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  77. package/build/src/backends/stdlib-support.js +237 -0
  78. package/build/src/backends/swift-runtime.d.ts +3 -0
  79. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  80. package/build/src/backends/swift-runtime.js +14 -0
  81. package/build/src/backends/swift.d.ts +8 -0
  82. package/build/src/backends/swift.d.ts.map +1 -0
  83. package/build/src/backends/swift.js +127 -0
  84. package/build/src/backends/typescript.d.ts.map +1 -1
  85. package/build/src/backends/typescript.js +344 -24
  86. package/build/src/backends/wasm.d.ts +43 -0
  87. package/build/src/backends/wasm.d.ts.map +1 -0
  88. package/build/src/backends/wasm.js +2164 -0
  89. package/build/src/backends/writer.d.ts +235 -4
  90. package/build/src/backends/writer.d.ts.map +1 -1
  91. package/build/src/backends/writer.js +468 -3
  92. package/build/src/diagnostic.d.ts +4 -3
  93. package/build/src/diagnostic.d.ts.map +1 -1
  94. package/build/src/diagnostic.js +5 -3
  95. package/build/src/frontends/c.d.ts.map +1 -1
  96. package/build/src/frontends/c.js +5 -3
  97. package/build/src/frontends/cpp.d.ts.map +1 -1
  98. package/build/src/frontends/cpp.js +5 -3
  99. package/build/src/frontends/csharp.d.ts.map +1 -1
  100. package/build/src/frontends/csharp.js +7 -3
  101. package/build/src/frontends/dart.d.ts +10 -0
  102. package/build/src/frontends/dart.d.ts.map +1 -0
  103. package/build/src/frontends/dart.js +913 -0
  104. package/build/src/frontends/index.d.ts +3 -1
  105. package/build/src/frontends/index.d.ts.map +1 -1
  106. package/build/src/frontends/index.js +15 -5
  107. package/build/src/frontends/java.d.ts +110 -1
  108. package/build/src/frontends/java.d.ts.map +1 -1
  109. package/build/src/frontends/java.js +1725 -70
  110. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  111. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  112. package/build/src/frontends/javascript-typescript.js +1825 -93
  113. package/build/src/frontends/kotlin.d.ts +10 -0
  114. package/build/src/frontends/kotlin.d.ts.map +1 -0
  115. package/build/src/frontends/kotlin.js +685 -0
  116. package/build/src/frontends/php.d.ts +118 -1
  117. package/build/src/frontends/php.d.ts.map +1 -1
  118. package/build/src/frontends/php.js +1583 -76
  119. package/build/src/frontends/program.d.ts +74 -0
  120. package/build/src/frontends/program.d.ts.map +1 -0
  121. package/build/src/frontends/program.js +989 -0
  122. package/build/src/frontends/ruby.d.ts +68 -1
  123. package/build/src/frontends/ruby.d.ts.map +1 -1
  124. package/build/src/frontends/ruby.js +1446 -101
  125. package/build/src/frontends/rust-parser.d.ts +11 -0
  126. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  127. package/build/src/frontends/rust-parser.js +15 -0
  128. package/build/src/frontends/rust.d.ts +14 -0
  129. package/build/src/frontends/rust.d.ts.map +1 -0
  130. package/build/src/frontends/rust.js +715 -0
  131. package/build/src/frontends/scalars.d.ts +10 -0
  132. package/build/src/frontends/scalars.d.ts.map +1 -1
  133. package/build/src/frontends/scalars.js +28 -2
  134. package/build/src/frontends/swift.d.ts +10 -0
  135. package/build/src/frontends/swift.d.ts.map +1 -0
  136. package/build/src/frontends/swift.js +860 -0
  137. package/build/src/frontends/types.d.ts +186 -0
  138. package/build/src/frontends/types.d.ts.map +1 -0
  139. package/build/src/frontends/types.js +634 -0
  140. package/build/src/language-registry.d.ts +46 -4
  141. package/build/src/language-registry.d.ts.map +1 -1
  142. package/build/src/language-registry.js +167 -13
  143. package/build/src/mapping.d.ts +2 -2
  144. package/build/src/mapping.d.ts.map +1 -1
  145. package/build/src/mapping.js +31 -10
  146. package/build/src/semantic/capabilities.d.ts +66 -0
  147. package/build/src/semantic/capabilities.d.ts.map +1 -0
  148. package/build/src/semantic/capabilities.js +649 -0
  149. package/build/src/semantic/effects.d.ts +26 -0
  150. package/build/src/semantic/effects.d.ts.map +1 -0
  151. package/build/src/semantic/effects.js +764 -0
  152. package/build/src/semantic/generics.d.ts +23 -0
  153. package/build/src/semantic/generics.d.ts.map +1 -0
  154. package/build/src/semantic/generics.js +61 -0
  155. package/build/src/semantic/lifetime.d.ts +37 -0
  156. package/build/src/semantic/lifetime.d.ts.map +1 -0
  157. package/build/src/semantic/lifetime.js +527 -0
  158. package/build/src/semantic/provenance.d.ts +9 -2
  159. package/build/src/semantic/provenance.d.ts.map +1 -1
  160. package/build/src/semantic/provenance.js +462 -20
  161. package/build/src/semantic/scalars.d.ts +11 -0
  162. package/build/src/semantic/scalars.d.ts.map +1 -1
  163. package/build/src/semantic/scalars.js +16 -1
  164. package/build/src/semantic/stdlib.d.ts +254 -0
  165. package/build/src/semantic/stdlib.d.ts.map +1 -0
  166. package/build/src/semantic/stdlib.js +880 -0
  167. package/build/src/semantic/types.d.ts +2952 -202
  168. package/build/src/semantic/types.d.ts.map +1 -1
  169. package/build/src/semantic/types.js +688 -15
  170. package/build/src/semantic/validate.d.ts +85 -5
  171. package/build/src/semantic/validate.d.ts.map +1 -1
  172. package/build/src/semantic/validate.js +2576 -98
  173. package/build/src/stdlib-facades.d.ts +304 -0
  174. package/build/src/stdlib-facades.d.ts.map +1 -0
  175. package/build/src/stdlib-facades.js +1167 -0
  176. package/build/src/stdlib-negotiation.d.ts +69 -0
  177. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  178. package/build/src/stdlib-negotiation.js +403 -0
  179. package/build/src/stdlib-providers.d.ts +72 -0
  180. package/build/src/stdlib-providers.d.ts.map +1 -0
  181. package/build/src/stdlib-providers.js +339 -0
  182. package/build/src/toolchains.d.ts +55 -1
  183. package/build/src/toolchains.d.ts.map +1 -1
  184. package/build/src/toolchains.js +15 -4
  185. package/docs/architecture.md +45 -13
  186. package/docs/dart.md +60 -0
  187. package/docs/goals.md +3 -3
  188. package/docs/ios.md +121 -0
  189. package/docs/kotlin.md +42 -0
  190. package/docs/language-support.md +231 -26
  191. package/docs/multi-file-modules.md +52 -0
  192. package/docs/parser-qualification.md +121 -8
  193. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  194. package/docs/rust.md +88 -0
  195. package/docs/source-maps.md +15 -7
  196. package/docs/standard-library-portability.md +39 -8
  197. package/docs/swift.md +44 -0
  198. package/docs/testing.md +366 -4
  199. package/docs/webassembly.md +52 -0
  200. package/index.js +63 -8
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  231. package/package.json +5 -2
  232. package/src/artifact-path.js +47 -2
  233. package/src/artifacts.js +67 -0
  234. package/src/backends/c-validation.js +6 -1
  235. package/src/backends/cpp-validation.js +6 -1
  236. package/src/backends/csharp.js +3 -0
  237. package/src/backends/dart-runtime.js +41 -0
  238. package/src/backends/dart.js +326 -0
  239. package/src/backends/effects.js +705 -0
  240. package/src/backends/go.js +14 -2
  241. package/src/backends/identifiers.js +160 -9
  242. package/src/backends/index.js +27 -2
  243. package/src/backends/ios.js +1612 -0
  244. package/src/backends/java.js +454 -36
  245. package/src/backends/javascript.js +389 -23
  246. package/src/backends/kotlin-runtime.js +29 -0
  247. package/src/backends/kotlin.js +141 -0
  248. package/src/backends/native-validation.js +1 -1
  249. package/src/backends/ordered-expressions.js +40 -6
  250. package/src/backends/php-stdlib-support.js +239 -0
  251. package/src/backends/php.js +469 -32
  252. package/src/backends/program.js +1407 -0
  253. package/src/backends/python.js +3 -0
  254. package/src/backends/ruby.js +326 -23
  255. package/src/backends/rust-runtime.js +34 -0
  256. package/src/backends/rust-validation.js +75 -0
  257. package/src/backends/rust.js +335 -0
  258. package/src/backends/scalars.js +141 -16
  259. package/src/backends/shared.js +2304 -124
  260. package/src/backends/stdlib-support.js +234 -0
  261. package/src/backends/swift-runtime.js +14 -0
  262. package/src/backends/swift.js +132 -0
  263. package/src/backends/typescript.js +349 -23
  264. package/src/backends/wasm.js +2208 -0
  265. package/src/backends/writer.js +520 -2
  266. package/src/diagnostic.js +4 -2
  267. package/src/frontends/c.js +4 -2
  268. package/src/frontends/cpp.js +4 -2
  269. package/src/frontends/csharp.js +4 -2
  270. package/src/frontends/dart.js +963 -0
  271. package/src/frontends/index.js +14 -4
  272. package/src/frontends/java.js +1977 -69
  273. package/src/frontends/javascript-typescript.js +2046 -102
  274. package/src/frontends/kotlin.js +713 -0
  275. package/src/frontends/php.js +1725 -79
  276. package/src/frontends/program.js +1062 -0
  277. package/src/frontends/ruby.js +1624 -98
  278. package/src/frontends/rust-parser.js +18 -0
  279. package/src/frontends/rust.js +714 -0
  280. package/src/frontends/scalars.js +31 -1
  281. package/src/frontends/swift.js +893 -0
  282. package/src/frontends/types.js +750 -0
  283. package/src/language-registry.js +172 -12
  284. package/src/mapping.js +33 -9
  285. package/src/semantic/capabilities.js +671 -0
  286. package/src/semantic/effects.js +737 -0
  287. package/src/semantic/generics.js +58 -0
  288. package/src/semantic/lifetime.js +517 -0
  289. package/src/semantic/provenance.js +412 -19
  290. package/src/semantic/scalars.js +17 -0
  291. package/src/semantic/stdlib.js +921 -0
  292. package/src/semantic/types.js +765 -14
  293. package/src/semantic/validate.js +2934 -209
  294. package/src/stdlib-facades.js +1211 -0
  295. package/src/stdlib-negotiation.js +446 -0
  296. package/src/stdlib-providers.js +377 -0
  297. package/src/toolchains.js +16 -3
@@ -24,6 +24,15 @@ export function withParserRanges(node, ranges) {
24
24
  setParserRanges(node, ranges);
25
25
  return node;
26
26
  }
27
+ /**
28
+ * Returns one parser-owned token range while frontend validation is still in progress.
29
+ * @param {object} node - Semantic node or type reference.
30
+ * @param {string} role - Exact semantic token role.
31
+ * @returns {import("./types.js").SourceLocation | undefined} Parser range when present.
32
+ */
33
+ export function parserRangeFor(node, role) {
34
+ return parserRanges.get(node)?.[role];
35
+ }
27
36
  /**
28
37
  * Adds deterministic provenance to a validated frontend module.
29
38
  * @param {import("./types.js").SemanticModule} module - Validated semantic module.
@@ -43,8 +52,14 @@ export function annotateParsedModule(module, { filename, language, source }) {
43
52
  for (const [index, entry] of entries.entries()) {
44
53
  const ranges = parserRanges.get(entry.node) ?? {};
45
54
  const location = "location" in entry.node ? entry.node.location : ranges.type ?? entry.ownerLocation;
55
+ const related = { location, sourceId: "source:0" };
56
+ const origin = entry.path.startsWith("/capabilities/")
57
+ ? { kind: /** @type {const} */ ("synthetic"), reason: "compiler-authorized capability", relatedOrigins: [related] }
58
+ : entry.node.kind == "OwnedMoveExpression" || entry.node.kind == "OwnedBorrowExpression"
59
+ ? { kind: /** @type {const} */ ("derived"), origins: [related] }
60
+ : { kind: /** @type {const} */ ("source"), location, sourceId: "source:0" };
46
61
  const sourceProvenance = /** @type {import("./types.js").SemanticNodeSourceProvenance} */ ({
47
- origin: { kind: "source", location, sourceId: "source:0" },
62
+ origin,
48
63
  ranges,
49
64
  schema: "SemantifoldNodeProvenance",
50
65
  version: 1
@@ -58,7 +73,8 @@ export function annotateParsedModule(module, { filename, language, source }) {
58
73
  };
59
74
  records.push(record);
60
75
  recordsByPath.set(entry.path, record);
61
- entry.node.sourceProvenance = sourceProvenance;
76
+ if (Object.isExtensible(entry.node))
77
+ Reflect.set(entry.node, "sourceProvenance", sourceProvenance);
62
78
  }
63
79
  const symbols = resolveSymbols(module, recordsByPath);
64
80
  module.provenance = {
@@ -106,13 +122,16 @@ export function createGenerationIndex(module, providedSources = []) {
106
122
  const records = [];
107
123
  for (const [index, entry] of entries.entries()) {
108
124
  const located = "location" in entry.node ? entry.node.location : entry.ownerLocation;
109
- const associated = usableNodeProvenance(entry.node.sourceProvenance);
125
+ const associated = usableNodeProvenance(Reflect.get(entry.node, "sourceProvenance"));
110
126
  const ranges = associated ? validRanges(associated.ranges, verifiableSources) : {};
111
127
  const normalizedOrigin = associated
112
128
  ? normalizeOrigin(associated.origin, priorSourcesById, verifiableSources)
113
129
  : undefined;
114
130
  const fallbackSource = sourceForLocation(located, sources);
115
- const origin = normalizedOrigin ?? sourceOrigin(fallbackSource, located);
131
+ const origin = entry.path.startsWith("/capabilities/")
132
+ ? { kind: /** @type {const} */ ("synthetic"), reason: "compiler-authorized capability",
133
+ relatedOrigins: [{ location: located, sourceId: fallbackSource.id }] }
134
+ : normalizedOrigin ?? sourceOrigin(fallbackSource, located);
116
135
  const record = {
117
136
  id: `node:${index}`,
118
137
  kind: entry.node.kind,
@@ -162,7 +181,7 @@ export function createGenerationIndex(module, providedSources = []) {
162
181
  */
163
182
  function addSource(filename, content, language) {
164
183
  if (typeof filename != "string" || content !== null && typeof content != "string" ||
165
- language !== null && !["php", "ruby", "javascript", "typescript", "java", "python", "csharp", "go", "c", "cpp"].includes(language)) {
184
+ language !== null && !["php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart"].includes(language)) {
166
185
  throw new TypeError("Malformed semantic source registry entry.");
167
186
  }
168
187
  const existing = sources.find((source) => source.filename == filename && source.content == content);
@@ -212,7 +231,7 @@ function usableSourceProvenance(provenance) {
212
231
  if (!source || typeof source.id != "string" || sourceIds.has(source.id) || typeof source.filename != "string" ||
213
232
  source.filename.length == 0 ||
214
233
  source.content !== null && typeof source.content != "string" || source.language !== null &&
215
- !["php", "ruby", "javascript", "typescript", "java", "python", "csharp", "go", "c", "cpp"].includes(source.language))
234
+ !["php", "ruby", "javascript", "typescript", "java", "kotlin", "python", "csharp", "go", "c", "cpp", "rust", "swift", "dart"].includes(source.language))
216
235
  return undefined;
217
236
  sourceIds.add(source.id);
218
237
  }
@@ -394,7 +413,7 @@ function requireProvenance(module) {
394
413
  }
395
414
  /**
396
415
  * Traverses public semantic nodes in one stable order.
397
- * @param {import("./types.js").SemanticModule} module - Semantic module.
416
+ * @param {import("./types.js").SemanticModule | import("./types.js").SemanticProgramModule} module - Semantic module.
398
417
  * @returns {{node: import("./types.js").SemanticNode, ownerLocation: import("./types.js").SourceLocation, path: string}[]} Entries.
399
418
  */
400
419
  export function semanticEntries(module) {
@@ -413,10 +432,62 @@ export function semanticEntries(module) {
413
432
  const location = "location" in node ? node.location : ownerLocation;
414
433
  entries.push({ node, ownerLocation: location, path });
415
434
  if (node.kind == "Module") {
435
+ if ("imports" in node) {
436
+ node.imports.forEach((child, index) => visit(child, `/imports/${index}`, location));
437
+ }
438
+ ;
439
+ (node.records ?? []).forEach((child, index) => visit(child, `/records/${index}`, location));
440
+ if (!("sourceFilename" in node) || Reflect.get(node, "stdlibFacade") !== undefined) {
441
+ ;
442
+ (node.classes ?? []).forEach((child, index) => visit(child, `/classes/${index}`, location));
443
+ }
444
+ ;
445
+ (node.errors ?? []).forEach((child, index) => visit(child, `/errors/${index}`, location));
446
+ (node.capabilities ?? []).forEach((child, index) => visit(child, `/capabilities/${index}`, location));
416
447
  node.functions.forEach((child, index) => visit(child, `/functions/${index}`, location));
417
- visit(node.entryPoint, "/entryPoint", location);
448
+ if ("exports" in node) {
449
+ node.exports.forEach((child, index) => visit(child, `/exports/${index}`, location));
450
+ }
451
+ if (node.entryPoint)
452
+ visit(node.entryPoint, "/entryPoint", location);
453
+ }
454
+ else if (node.kind == "RecordDeclaration") {
455
+ ;
456
+ (node.typeParameters ?? []).forEach((child, index) => visit(child, `${path}/typeParameters/${index}`, location));
457
+ node.fields.forEach((child, index) => visit(child, `${path}/fields/${index}`, location));
458
+ }
459
+ else if (node.kind == "EffectCapabilityDeclaration") {
460
+ node.resources.forEach((child, index) => visit(child, `${path}/resources/${index}`, location));
461
+ node.failures.forEach((child, index) => visit(child, `${path}/failures/${index}`, location));
462
+ node.operations.forEach((child, index) => visit(child, `${path}/operations/${index}`, location));
463
+ }
464
+ else if (node.kind == "EffectOperationDeclaration") {
465
+ node.parameters.forEach((child, index) => visit(child.type, `${path}/parameters/${index}/type`, location));
466
+ visit(node.returnType, `${path}/returnType`, location);
467
+ }
468
+ else if (node.kind == "ClassDeclaration") {
469
+ node.fields.forEach((child, index) => visit(child, `${path}/fields/${index}`, location));
470
+ visit(node.constructor, `${path}/constructor`, location);
471
+ node.methods.forEach((child, index) => visit(child, `${path}/methods/${index}`, location));
472
+ }
473
+ else if (node.kind == "PrivateField") {
474
+ visit(node.type, `${path}/type`, location);
475
+ }
476
+ else if (node.kind == "ConstructorDeclaration") {
477
+ node.parameters.forEach((child, index) => visit(child, `${path}/parameters/${index}`, location));
478
+ visit(node.body, `${path}/body`, location);
479
+ }
480
+ else if (node.kind == "MethodDeclaration") {
481
+ node.parameters.forEach((child, index) => visit(child, `${path}/parameters/${index}`, location));
482
+ visit(node.returnType, `${path}/returnType`, location);
483
+ visit(node.body, `${path}/body`, location);
484
+ }
485
+ else if (node.kind == "RecordField") {
486
+ visit(node.type, `${path}/type`, location);
418
487
  }
419
488
  else if (node.kind == "FunctionDeclaration") {
489
+ ;
490
+ (node.typeParameters ?? []).forEach((child, index) => visit(child, `${path}/typeParameters/${index}`, location));
420
491
  node.parameters.forEach((child, index) => visit(child, `${path}/parameters/${index}`, location));
421
492
  visit(node.returnType, `${path}/returnType`, location);
422
493
  visit(node.body, `${path}/body`, location);
@@ -427,6 +498,26 @@ export function semanticEntries(module) {
427
498
  else if (node.kind == "Parameter") {
428
499
  visit(node.type, `${path}/type`, location);
429
500
  }
501
+ else if (node.kind == "ValueBinding") {
502
+ visit(node.type, `${path}/type`, location);
503
+ }
504
+ else if (node.kind == "CatchBinding") {
505
+ visit(node.type, `${path}/type`, location);
506
+ }
507
+ else if (node.kind == "ListType") {
508
+ visit(node.elementType, `${path}/elementType`, location);
509
+ }
510
+ else if (node.kind == "MapType" || node.kind == "OrderedMapType") {
511
+ visit(node.keyType, `${path}/keyType`, location);
512
+ visit(node.valueType, `${path}/valueType`, location);
513
+ }
514
+ else if (node.kind == "OptionalType") {
515
+ visit(node.valueType, `${path}/valueType`, location);
516
+ }
517
+ else if (node.kind == "RecordType") {
518
+ ;
519
+ (node.arguments ?? []).forEach((child, index) => visit(child, `${path}/arguments/${index}`, location));
520
+ }
430
521
  else if (node.kind == "LocalDeclaration") {
431
522
  visit(node.type, `${path}/type`, location);
432
523
  visit(node.initializer, `${path}/initializer`, location);
@@ -435,7 +526,15 @@ export function semanticEntries(module) {
435
526
  visit(node.target, `${path}/target`, location);
436
527
  visit(node.expression, `${path}/expression`, location);
437
528
  }
438
- else if (node.kind == "ReturnStatement" || node.kind == "PrintStatement") {
529
+ else if (node.kind == "PrivateFieldWriteStatement") {
530
+ visit(node.receiver, `${path}/receiver`, location);
531
+ visit(node.expression, `${path}/expression`, location);
532
+ }
533
+ else if (node.kind == "ReturnStatement") {
534
+ if (node.expression)
535
+ visit(node.expression, `${path}/expression`, location);
536
+ }
537
+ else if (node.kind == "ExpressionStatement" || node.kind == "PrintStatement") {
439
538
  visit(node.expression, `${path}/expression`, location);
440
539
  }
441
540
  else if (node.kind == "IfStatement") {
@@ -444,6 +543,30 @@ export function semanticEntries(module) {
444
543
  if (node.alternate)
445
544
  visit(node.alternate, `${path}/alternate`, location);
446
545
  }
546
+ else if (node.kind == "ForEachStatement") {
547
+ visit(node.list, `${path}/list`, location);
548
+ visit(node.valueBinding, `${path}/valueBinding`, location);
549
+ visit(node.body, `${path}/body`, location);
550
+ }
551
+ else if (node.kind == "ForEachMapStatement") {
552
+ visit(node.map, `${path}/map`, location);
553
+ visit(node.keyBinding, `${path}/keyBinding`, location);
554
+ visit(node.valueBinding, `${path}/valueBinding`, location);
555
+ visit(node.body, `${path}/body`, location);
556
+ }
557
+ else if (node.kind == "WhileStatement") {
558
+ visit(node.condition, `${path}/condition`, location);
559
+ visit(node.body, `${path}/body`, location);
560
+ }
561
+ else if (node.kind == "RaiseStatement") {
562
+ visit(node.error, `${path}/error`, location);
563
+ }
564
+ else if (node.kind == "TryStatement") {
565
+ visit(node.body, `${path}/body`, location);
566
+ visit(node.catchType, `${path}/catchType`, location);
567
+ visit(node.catchBinding, `${path}/catchBinding`, location);
568
+ visit(node.catchBody, `${path}/catchBody`, location);
569
+ }
447
570
  else if (node.kind == "EntryPoint") {
448
571
  visit(node.body, `${path}/body`, location);
449
572
  }
@@ -454,9 +577,64 @@ export function semanticEntries(module) {
454
577
  visit(node.left, `${path}/left`, location);
455
578
  visit(node.right, `${path}/right`, location);
456
579
  }
457
- else if (node.kind == "CallExpression") {
580
+ else if (node.kind == "CallExpression" || node.kind == "EffectCallExpression") {
581
+ node.arguments.forEach((child, index) => visit(child, `${path}/arguments/${index}`, location));
582
+ }
583
+ else if (node.kind == "OwnedMoveExpression" || node.kind == "OwnedBorrowExpression") {
584
+ visit(node.expression, `${path}/expression`, location);
585
+ }
586
+ else if (node.kind == "MethodCallExpression") {
587
+ visit(node.receiver, `${path}/receiver`, location);
588
+ node.arguments.forEach((child, index) => visit(child, `${path}/arguments/${index}`, location));
589
+ }
590
+ else if (node.kind == "ReferenceConstruction") {
591
+ visit(node.reference, `${path}/reference`, location);
592
+ node.arguments.forEach((child, index) => visit(child, `${path}/arguments/${index}`, location));
593
+ }
594
+ else if (node.kind == "RecordConstruction") {
595
+ visit(node.record, `${path}/record`, location);
458
596
  node.arguments.forEach((child, index) => visit(child, `${path}/arguments/${index}`, location));
459
597
  }
598
+ else if (node.kind == "MemberRead") {
599
+ visit(node.receiver, `${path}/receiver`, location);
600
+ }
601
+ else if (node.kind == "PrivateFieldRead") {
602
+ visit(node.receiver, `${path}/receiver`, location);
603
+ }
604
+ else if (node.kind == "ErrorConstruction") {
605
+ visit(node.error, `${path}/error`, location);
606
+ visit(node.message, `${path}/message`, location);
607
+ }
608
+ else if (node.kind == "ErrorMessageRead") {
609
+ visit(node.receiver, `${path}/receiver`, location);
610
+ }
611
+ else if (node.kind == "ListLiteral") {
612
+ node.elements.forEach((child, index) => visit(child, `${path}/elements/${index}`, location));
613
+ }
614
+ else if (node.kind == "MapLiteral" || node.kind == "OrderedMapLiteral") {
615
+ node.entries.forEach((child, index) => visit(child, `${path}/entries/${index}`, location));
616
+ }
617
+ else if (node.kind == "MapEntry") {
618
+ visit(node.key, `${path}/key`, location);
619
+ visit(node.value, `${path}/value`, location);
620
+ }
621
+ else if (node.kind == "ListIndexExpression") {
622
+ visit(node.collection, `${path}/collection`, location);
623
+ visit(node.index, `${path}/index`, location);
624
+ }
625
+ else if (node.kind == "MapLookupExpression") {
626
+ visit(node.collection, `${path}/collection`, location);
627
+ visit(node.key, `${path}/key`, location);
628
+ }
629
+ else if (node.kind == "CollectionSizeExpression") {
630
+ visit(node.collection, `${path}/collection`, location);
631
+ }
632
+ else if (node.kind == "OptionalSome") {
633
+ visit(node.value, `${path}/value`, location);
634
+ }
635
+ else if (node.kind == "OptionalIsPresent" || node.kind == "OptionalUnwrap") {
636
+ visit(node.operand, `${path}/operand`, location);
637
+ }
460
638
  }
461
639
  }
462
640
  /**
@@ -470,22 +648,136 @@ function resolveSymbols(module, records) {
470
648
  const symbols = [];
471
649
  /** @type {Map<string, string>} */
472
650
  const functions = new Map();
651
+ /** @type {Map<string, string>} */
652
+ const recordSymbols = new Map();
653
+ /** @type {Map<string, string>} */
654
+ const errorSymbols = new Map();
655
+ /** @type {Map<string, string>} */
656
+ const fieldSymbols = new Map();
657
+ /** @type {Map<string, string>} */
658
+ const classSymbols = new Map();
659
+ /** @type {Map<string, string>} */
660
+ const constructorSymbols = new Map();
661
+ /** @type {Map<string, string>} */
662
+ const methodSymbols = new Map();
663
+ /** @type {Map<string, string>} */
664
+ const typeParameterSymbols = new Map();
665
+ /** @type {Map<string, string>} */
666
+ const resourceSymbols = new Map();
667
+ /** @type {Map<string, string>} */
668
+ const operationSymbols = new Map();
669
+ for (const [capabilityIndex, capability] of (module.capabilities ?? []).entries()) {
670
+ const capabilityPath = `/capabilities/${capabilityIndex}`;
671
+ declare(capability, capability.name, "capability", capabilityPath);
672
+ for (const [resourceIndex, resource] of capability.resources.entries()) {
673
+ resourceSymbols.set(resource.id, declare(resource, resource.name, "resource", `${capabilityPath}/resources/${resourceIndex}`));
674
+ }
675
+ for (const [failureIndex, failure] of capability.failures.entries()) {
676
+ errorSymbols.set(failure.id, declare(failure, failure.name, "failure", `${capabilityPath}/failures/${failureIndex}`));
677
+ }
678
+ for (const [operationIndex, operation] of capability.operations.entries()) {
679
+ operationSymbols.set(operation.id, declare(operation, operation.name, "operation", `${capabilityPath}/operations/${operationIndex}`));
680
+ }
681
+ }
682
+ for (const [capabilityIndex, capability] of (module.capabilities ?? []).entries()) {
683
+ for (const [operationIndex, operation] of capability.operations.entries()) {
684
+ const operationPath = `/capabilities/${capabilityIndex}/operations/${operationIndex}`;
685
+ operation.parameters.forEach((parameter, parameterIndex) => visitType(parameter.type, `${operationPath}/parameters/${parameterIndex}/type`));
686
+ visitType(operation.returnType, `${operationPath}/returnType`);
687
+ }
688
+ }
689
+ for (const [index, declaration] of (module.records ?? []).entries()) {
690
+ const declarationPath = `/records/${index}`;
691
+ const symbol = declare(declaration, declaration.name, "record", declarationPath);
692
+ if (declaration.id)
693
+ recordSymbols.set(declaration.id, symbol);
694
+ for (const [parameterIndex, parameter] of (declaration.typeParameters ?? []).entries()) {
695
+ const parameterSymbol = declare(parameter, parameter.name, "typeParameter", `${declarationPath}/typeParameters/${parameterIndex}`);
696
+ if (parameter.id)
697
+ typeParameterSymbols.set(parameter.id, parameterSymbol);
698
+ }
699
+ for (const [fieldIndex, field] of declaration.fields.entries()) {
700
+ const fieldPath = `${declarationPath}/fields/${fieldIndex}`;
701
+ const fieldSymbol = declare(field, field.name, "field", fieldPath);
702
+ if (field.id)
703
+ fieldSymbols.set(field.id, fieldSymbol);
704
+ }
705
+ }
706
+ for (const [index, declaration] of (module.errors ?? []).entries()) {
707
+ const symbol = declare(declaration, declaration.name, "error", `/errors/${index}`);
708
+ if (declaration.id)
709
+ errorSymbols.set(declaration.id, symbol);
710
+ }
711
+ for (const [index, declaration] of (module.classes ?? []).entries()) {
712
+ const declarationPath = `/classes/${index}`;
713
+ const classSymbol = declare(declaration, declaration.name, "class", declarationPath);
714
+ if (declaration.id)
715
+ classSymbols.set(declaration.id, classSymbol);
716
+ for (const [fieldIndex, field] of declaration.fields.entries()) {
717
+ const symbol = declare(field, field.name, "field", `${declarationPath}/fields/${fieldIndex}`);
718
+ if (field.id)
719
+ fieldSymbols.set(field.id, symbol);
720
+ visitType(field.type, `${declarationPath}/fields/${fieldIndex}/type`);
721
+ }
722
+ const constructorSymbol = declare(declaration.constructor, "constructor", "constructor", `${declarationPath}/constructor`);
723
+ if (declaration.constructor.id)
724
+ constructorSymbols.set(declaration.constructor.id, constructorSymbol);
725
+ for (const [methodIndex, method] of declaration.methods.entries()) {
726
+ const symbol = declare(method, method.name, "method", `${declarationPath}/methods/${methodIndex}`);
727
+ if (method.id)
728
+ methodSymbols.set(method.id, symbol);
729
+ }
730
+ }
731
+ for (const [index, declaration] of (module.records ?? []).entries()) {
732
+ for (const [fieldIndex, field] of declaration.fields.entries()) {
733
+ visitType(field.type, `/records/${index}/fields/${fieldIndex}/type`);
734
+ }
735
+ }
473
736
  for (const [index, declaration] of module.functions.entries()) {
474
- functions.set(declaration.name, declare(declaration, declaration.name, "function", `/functions/${index}`));
737
+ const declarationPath = `/functions/${index}`;
738
+ functions.set(declaration.name, declare(declaration, declaration.name, "function", declarationPath));
739
+ for (const [parameterIndex, parameter] of (declaration.typeParameters ?? []).entries()) {
740
+ const parameterSymbol = declare(parameter, parameter.name, "typeParameter", `${declarationPath}/typeParameters/${parameterIndex}`);
741
+ if (parameter.id)
742
+ typeParameterSymbols.set(parameter.id, parameterSymbol);
743
+ }
475
744
  }
476
745
  for (const [index, declaration] of module.functions.entries()) {
477
746
  const declarationPath = `/functions/${index}`;
478
747
  const scope = new Map();
479
748
  for (const [parameterIndex, parameter] of declaration.parameters.entries()) {
480
749
  scope.set(parameter.name, declare(parameter, parameter.name, "parameter", `${declarationPath}/parameters/${parameterIndex}`));
750
+ visitType(parameter.type, `${declarationPath}/parameters/${parameterIndex}/type`);
481
751
  }
752
+ visitType(declaration.returnType, `${declarationPath}/returnType`);
482
753
  visitBlock(declaration.body, scope, `${declarationPath}/body`);
483
754
  }
755
+ for (const [classIndex, declaration] of (module.classes ?? []).entries()) {
756
+ const declarationPath = `/classes/${classIndex}`;
757
+ const constructorScope = new Map();
758
+ for (const [parameterIndex, parameter] of declaration.constructor.parameters.entries()) {
759
+ const path = `${declarationPath}/constructor/parameters/${parameterIndex}`;
760
+ constructorScope.set(parameter.name, declare(parameter, parameter.name, "parameter", path));
761
+ visitType(parameter.type, `${path}/type`);
762
+ }
763
+ visitBlock(declaration.constructor.body, constructorScope, `${declarationPath}/constructor/body`);
764
+ for (const [methodIndex, method] of declaration.methods.entries()) {
765
+ const methodPath = `${declarationPath}/methods/${methodIndex}`;
766
+ const scope = new Map();
767
+ for (const [parameterIndex, parameter] of method.parameters.entries()) {
768
+ const path = `${methodPath}/parameters/${parameterIndex}`;
769
+ scope.set(parameter.name, declare(parameter, parameter.name, "parameter", path));
770
+ visitType(parameter.type, `${path}/type`);
771
+ }
772
+ visitType(method.returnType, `${methodPath}/returnType`);
773
+ visitBlock(method.body, scope, `${methodPath}/body`);
774
+ }
775
+ }
484
776
  visitBlock(module.entryPoint.body, new Map(), "/entryPoint/body");
485
777
  return symbols;
486
778
  /**
487
779
  * Declares one canonical symbol.
488
- * @param {import("./types.js").FunctionDeclaration | import("./types.js").Parameter | import("./types.js").LocalDeclaration} node - Declaration.
780
+ * @param {import("./types.js").EffectCapabilityDeclaration | import("./types.js").EffectResourceDeclaration | import("./types.js").EffectFailureDeclaration | import("./types.js").EffectOperationDeclaration | import("./types.js").RecordDeclaration | import("./types.js").ClassDeclaration | import("./types.js").ErrorDeclaration | import("./types.js").RecordField | import("./types.js").PrivateField | import("./types.js").ConstructorDeclaration | import("./types.js").MethodDeclaration | import("./types.js").FunctionDeclaration | import("./types.js").TypeParameter | import("./types.js").Parameter | import("./types.js").LocalDeclaration | import("./types.js").ValueBinding | import("./types.js").CatchBinding} node - Declaration.
489
781
  * @param {string} name - Symbol name.
490
782
  * @param {import("./types.js").SemanticSymbolKind} kind - Symbol kind.
491
783
  * @param {string} path - Declaration occurrence path.
@@ -495,10 +787,20 @@ function resolveSymbols(module, records) {
495
787
  const record = records.get(path);
496
788
  if (!record)
497
789
  throw new Error(`Missing provenance for ${node.kind}.`);
498
- const location = record.ranges.name ?? node.location;
790
+ const location = record.ranges.name ?? ("location" in node ? node.location : primaryLocation(record.origin));
499
791
  const id = `symbol:${symbols.length}`;
500
792
  record.symbolId = id;
501
- symbols.push({ declarationNodeId: record.id, id, kind, location, name, references: [] });
793
+ symbols.push({
794
+ declarationNodeId: record.id,
795
+ id,
796
+ kind,
797
+ location,
798
+ name,
799
+ references: [],
800
+ ...(["capability", "resource", "failure", "operation", "record", "class", "error", "field", "constructor", "method", "function", "typeParameter"].includes(kind)
801
+ ? { semanticDeclarationId: /** @type {{id?: string}} */ (node).id }
802
+ : {})
803
+ });
502
804
  return id;
503
805
  }
504
806
  /**
@@ -513,6 +815,7 @@ function resolveSymbols(module, records) {
513
815
  for (const [index, statement] of block.statements.entries()) {
514
816
  const statementPath = `${path}/statements/${index}`;
515
817
  if (statement.kind == "LocalDeclaration") {
818
+ visitType(statement.type, `${statementPath}/type`);
516
819
  visitExpression(statement.initializer, scope, `${statementPath}/initializer`);
517
820
  scope.set(statement.name, declare(statement, statement.name, "local", statementPath));
518
821
  }
@@ -520,7 +823,16 @@ function resolveSymbols(module, records) {
520
823
  reference(statement.target, scope.get(statement.target.name), "write", `${statementPath}/target`);
521
824
  visitExpression(statement.expression, scope, `${statementPath}/expression`);
522
825
  }
523
- else if (statement.kind == "ReturnStatement" || statement.kind == "PrintStatement") {
826
+ else if (statement.kind == "PrivateFieldWriteStatement") {
827
+ reference(statement, fieldSymbols.get(statement.field), "write", statementPath);
828
+ visitExpression(statement.receiver, scope, `${statementPath}/receiver`);
829
+ visitExpression(statement.expression, scope, `${statementPath}/expression`);
830
+ }
831
+ else if (statement.kind == "ReturnStatement") {
832
+ if (statement.expression)
833
+ visitExpression(statement.expression, scope, `${statementPath}/expression`);
834
+ }
835
+ else if (statement.kind == "ExpressionStatement" || statement.kind == "PrintStatement") {
524
836
  visitExpression(statement.expression, scope, `${statementPath}/expression`);
525
837
  }
526
838
  else if (statement.kind == "IfStatement") {
@@ -529,6 +841,39 @@ function resolveSymbols(module, records) {
529
841
  if (statement.alternate)
530
842
  visitBlock(statement.alternate, scope, `${statementPath}/alternate`);
531
843
  }
844
+ else if (statement.kind == "ForEachStatement") {
845
+ visitExpression(statement.list, scope, `${statementPath}/list`);
846
+ const bodyScope = new Map(scope);
847
+ visitType(statement.valueBinding.type, `${statementPath}/valueBinding/type`);
848
+ bodyScope.set(statement.valueBinding.name, declare(statement.valueBinding, statement.valueBinding.name, "iteration", `${statementPath}/valueBinding`));
849
+ visitBlock(statement.body, bodyScope, `${statementPath}/body`);
850
+ }
851
+ else if (statement.kind == "ForEachMapStatement") {
852
+ visitExpression(statement.map, scope, `${statementPath}/map`);
853
+ const bodyScope = new Map(scope);
854
+ visitType(statement.keyBinding.type, `${statementPath}/keyBinding/type`);
855
+ visitType(statement.valueBinding.type, `${statementPath}/valueBinding/type`);
856
+ bodyScope.set(statement.keyBinding.name, declare(statement.keyBinding, statement.keyBinding.name, "iteration", `${statementPath}/keyBinding`));
857
+ bodyScope.set(statement.valueBinding.name, declare(statement.valueBinding, statement.valueBinding.name, "iteration", `${statementPath}/valueBinding`));
858
+ visitBlock(statement.body, bodyScope, `${statementPath}/body`);
859
+ }
860
+ else if (statement.kind == "WhileStatement") {
861
+ visitExpression(statement.condition, scope, `${statementPath}/condition`);
862
+ visitBlock(statement.body, scope, `${statementPath}/body`);
863
+ }
864
+ else if (statement.kind == "RaiseStatement") {
865
+ visitType(statement.error.error, `${statementPath}/error/error`);
866
+ reference(statement.error, errorSymbols.get(statement.error.error.declarationId), "construct", `${statementPath}/error`);
867
+ visitExpression(statement.error.message, scope, `${statementPath}/error/message`);
868
+ }
869
+ else if (statement.kind == "TryStatement") {
870
+ visitBlock(statement.body, scope, `${statementPath}/body`);
871
+ visitType(statement.catchType, `${statementPath}/catchType`);
872
+ visitType(statement.catchBinding.type, `${statementPath}/catchBinding/type`);
873
+ const catchScope = new Map(scope);
874
+ catchScope.set(statement.catchBinding.name, declare(statement.catchBinding, statement.catchBinding.name, "catch", `${statementPath}/catchBinding`));
875
+ visitBlock(statement.catchBody, catchScope, `${statementPath}/catchBody`);
876
+ }
532
877
  }
533
878
  }
534
879
  /**
@@ -541,11 +886,49 @@ function resolveSymbols(module, records) {
541
886
  function visitExpression(expression, scope, path) {
542
887
  if (expression.kind == "IdentifierExpression")
543
888
  reference(expression, scope.get(expression.name), "read", path);
889
+ else if (expression.kind == "ReceiverExpression")
890
+ reference(expression, classSymbols.get(expression.classId), "read", path);
544
891
  else if (expression.kind == "CallExpression") {
545
- reference(expression, functions.get(expression.callee), "call", path);
892
+ const declaration = module.functions.find((candidate) => candidate.id == expression.resolution?.declarationId);
893
+ reference(expression, declaration ? functions.get(declaration.name) : undefined, "call", path);
546
894
  for (const [index, argument] of expression.arguments.entries())
547
895
  visitExpression(argument, scope, `${path}/arguments/${index}`);
548
896
  }
897
+ else if (expression.kind == "EffectCallExpression") {
898
+ reference(expression, operationSymbols.get(expression.operation), "call", path);
899
+ for (const [index, argument] of expression.arguments.entries())
900
+ visitExpression(argument, scope, `${path}/arguments/${index}`);
901
+ }
902
+ else if (expression.kind == "OwnedMoveExpression" || expression.kind == "OwnedBorrowExpression") {
903
+ visitExpression(expression.expression, scope, `${path}/expression`);
904
+ }
905
+ else if (expression.kind == "RecordConstruction") {
906
+ reference(expression, recordSymbols.get(expression.record.declarationId), "construct", path);
907
+ for (const [index, argument] of expression.arguments.entries())
908
+ visitExpression(argument, scope, `${path}/arguments/${index}`);
909
+ }
910
+ else if (expression.kind == "ReferenceConstruction") {
911
+ reference(expression, constructorSymbols.get(/** @type {string} */ (expression.resolution?.declarationId)), "construct", path);
912
+ for (const [index, argument] of expression.arguments.entries())
913
+ visitExpression(argument, scope, `${path}/arguments/${index}`);
914
+ }
915
+ else if (expression.kind == "MethodCallExpression") {
916
+ reference(expression, methodSymbols.get(expression.method), "call", path);
917
+ visitExpression(expression.receiver, scope, `${path}/receiver`);
918
+ for (const [index, argument] of expression.arguments.entries())
919
+ visitExpression(argument, scope, `${path}/arguments/${index}`);
920
+ }
921
+ else if (expression.kind == "MemberRead") {
922
+ reference(expression, fieldSymbols.get(expression.field), "member", path);
923
+ visitExpression(expression.receiver, scope, `${path}/receiver`);
924
+ }
925
+ else if (expression.kind == "PrivateFieldRead") {
926
+ reference(expression, fieldSymbols.get(expression.field), "member", path);
927
+ visitExpression(expression.receiver, scope, `${path}/receiver`);
928
+ }
929
+ else if (expression.kind == "ErrorMessageRead") {
930
+ visitExpression(expression.receiver, scope, `${path}/receiver`);
931
+ }
549
932
  else if (expression.kind == "UnaryExpression") {
550
933
  visitExpression(expression.operand, scope, `${path}/operand`);
551
934
  }
@@ -553,12 +936,68 @@ function resolveSymbols(module, records) {
553
936
  visitExpression(expression.left, scope, `${path}/left`);
554
937
  visitExpression(expression.right, scope, `${path}/right`);
555
938
  }
939
+ else if (expression.kind == "ListLiteral") {
940
+ for (const [index, element] of expression.elements.entries())
941
+ visitExpression(element, scope, `${path}/elements/${index}`);
942
+ }
943
+ else if (expression.kind == "MapLiteral" || expression.kind == "OrderedMapLiteral") {
944
+ for (const [index, entry] of expression.entries.entries()) {
945
+ visitExpression(entry.key, scope, `${path}/entries/${index}/key`);
946
+ visitExpression(entry.value, scope, `${path}/entries/${index}/value`);
947
+ }
948
+ }
949
+ else if (expression.kind == "ListIndexExpression") {
950
+ visitExpression(expression.collection, scope, `${path}/collection`);
951
+ visitExpression(expression.index, scope, `${path}/index`);
952
+ }
953
+ else if (expression.kind == "MapLookupExpression") {
954
+ visitExpression(expression.collection, scope, `${path}/collection`);
955
+ visitExpression(expression.key, scope, `${path}/key`);
956
+ }
957
+ else if (expression.kind == "CollectionSizeExpression") {
958
+ visitExpression(expression.collection, scope, `${path}/collection`);
959
+ }
960
+ else if (expression.kind == "OptionalSome") {
961
+ visitExpression(expression.value, scope, `${path}/value`);
962
+ }
963
+ else if (expression.kind == "OptionalIsPresent" || expression.kind == "OptionalUnwrap") {
964
+ visitExpression(expression.operand, scope, `${path}/operand`);
965
+ }
966
+ }
967
+ /**
968
+ * Resolves nominal references nested in a semantic type.
969
+ * @param {import("./types.js").SemanticFunctionReturnType | import("./types.js").ErrorType} type - Semantic type.
970
+ * @param {string} path - Type occurrence path.
971
+ * @returns {void}
972
+ */
973
+ function visitType(type, path) {
974
+ if (type.kind == "TypeVariableReference")
975
+ reference(type, typeParameterSymbols.get(type.parameterId), "type", path);
976
+ else if (type.kind == "RecordType") {
977
+ reference(type, recordSymbols.get(type.declarationId), "type", path);
978
+ for (const [index, argument] of (type.arguments ?? []).entries())
979
+ visitType(argument, `${path}/arguments/${index}`);
980
+ }
981
+ else if (type.kind == "ErrorType")
982
+ reference(type, errorSymbols.get(type.declarationId), "type", path);
983
+ else if (type.kind == "ReferenceType" || type.kind == "OwnedReferenceType")
984
+ reference(type, classSymbols.get(type.declarationId), "type", path);
985
+ else if (type.kind == "OwnedResourceType")
986
+ reference(type, resourceSymbols.get(type.resourceId), "type", path);
987
+ else if (type.kind == "ListType")
988
+ visitType(type.elementType, `${path}/elementType`);
989
+ else if (type.kind == "MapType" || type.kind == "OrderedMapType") {
990
+ visitType(type.keyType, `${path}/keyType`);
991
+ visitType(type.valueType, `${path}/valueType`);
992
+ }
993
+ else if (type.kind == "OptionalType")
994
+ visitType(type.valueType, `${path}/valueType`);
556
995
  }
557
996
  /**
558
997
  * Attaches one resolved symbol reference.
559
- * @param {import("./types.js").IdentifierExpression | import("./types.js").CallExpression} node - Reference node.
998
+ * @param {import("./types.js").IdentifierExpression | import("./types.js").ReceiverExpression | import("./types.js").CallExpression | import("./types.js").EffectCallExpression | import("./types.js").MethodCallExpression | import("./types.js").TypeVariableReference | import("./types.js").RecordType | import("./types.js").ReferenceType | import("./types.js").OwnedReferenceType | import("./types.js").OwnedResourceType | import("./types.js").RecordConstruction | import("./types.js").ReferenceConstruction | import("./types.js").MemberRead | import("./types.js").PrivateFieldRead | import("./types.js").PrivateFieldWriteStatement | import("./types.js").ErrorType | import("./types.js").ErrorConstruction} node - Reference node.
560
999
  * @param {string | undefined} symbolId - Resolved symbol.
561
- * @param {"read" | "write" | "call"} role - Reference role.
1000
+ * @param {"type" | "construct" | "member" | "read" | "write" | "call"} role - Reference role.
562
1001
  * @param {string} path - Reference occurrence path.
563
1002
  * @returns {void}
564
1003
  */
@@ -569,9 +1008,12 @@ function resolveSymbols(module, records) {
569
1008
  const symbol = symbols.find((candidate) => candidate.id == symbolId);
570
1009
  if (!record || !symbol)
571
1010
  throw new Error(`Missing provenance while resolving ${node.kind}.`);
572
- const location = record.ranges[role == "call" ? "callee" : "name"] ?? node.location;
1011
+ const rangeRole = role == "call" ? (node.kind == "MethodCallExpression" ? "member" : "callee") :
1012
+ role == "construct" ? (node.kind == "ErrorConstruction" ? "type" : node.kind == "ReferenceConstruction" ? "class" : "record") :
1013
+ role == "member" || role == "write" && node.kind == "PrivateFieldWriteStatement" ? "member" : role == "type" ? "type" : "name";
1014
+ const location = record.ranges[rangeRole] ?? ("location" in node ? node.location : primaryLocation(record.origin));
573
1015
  record.symbolId = symbolId;
574
1016
  symbol.references.push({ location, nodeId: record.id, role });
575
1017
  }
576
1018
  }
577
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVuYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFBO0FBRW5FLDZGQUE2RjtBQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVHQUF1RztBQUN2RyxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNO0lBQzFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU07SUFDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUU3QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQztJQUN2RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2Qyx1RUFBdUU7SUFDdkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMvQiw0REFBNEQ7SUFDNUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLEtBQUssTUFBTSxDQUFDLEtB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ZWNrXG5cbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkUG9pbnRBdH0gZnJvbSBcIi4vbG9jYXRpb24uanNcIlxuXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj4+fSAqL1xuY29uc3QgcGFyc2VyUmFuZ2VzID0gbmV3IFdlYWtNYXAoKVxuLyoqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZSwgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59ICovXG5jb25zdCBzb3VyY2VDb29yZGluYXRlSW5kZXhlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBSZWNvcmRzIHBhcnNlci1wcm92aWRlZCBzZW1hbnRpYy10b2tlbiByYW5nZXMgd2l0aG91dCBleHBvc2luZyBwYXJzZXIgdHJlZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gbm9kZSAtIFNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgcm9sZSByYW5nZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgcGFyc2VyUmFuZ2VzLnNldChub2RlLCByYW5nZXMpXG59XG5cbi8qKlxuICogUmVjb3JkcyBwYXJzZXIgcmFuZ2VzIGFuZCByZXR1cm5zIHRoZSBzYW1lIHNlbWFudGljIG5vZGUuXG4gKiBAdGVtcGxhdGUge29iamVjdH0gTm9kZVxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCByb2xlIHJhbmdlcy5cbiAqIEByZXR1cm5zIHtOb2RlfSBUaGUgc2FtZSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgc2V0UGFyc2VyUmFuZ2VzKG5vZGUsIHJhbmdlcylcblxuICByZXR1cm4gbm9kZVxufVxuXG4vKipcbiAqIEFkZHMgZGV0ZXJtaW5pc3RpYyBwcm92ZW5hbmNlIHRvIGEgdmFsaWRhdGVkIGZyb250ZW5kIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBQYXJzZWQgc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZS5maWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBzb3VyY2UubGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlLnNvdXJjZSAtIEV4YWN0IHNvdXJjZSBjb250ZW50LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFRoZSBzYW1lIHNlbWFudGljIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwge2ZpbGVuYW1lLCBsYW5ndWFnZSwgc291cmNlfSkge1xuICBjb25zdCBzb3VyY2VzID0gW3tjb250ZW50OiBzb3VyY2UsIGZpbGVuYW1lLCBpZDogXCJzb3VyY2U6MFwiLCBsYW5ndWFnZX1dXG4gIGNvbnN0IGVudHJpZXMgPSBzZW1hbnRpY0VudHJpZXMobW9kdWxlKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZT59ICovXG4gIGNvbnN0IHJlY29yZHNCeVBhdGggPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IFtdXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBlbnRyaWVzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJhbmdlcyA9IHBhcnNlclJhbmdlcy5nZXQoZW50cnkubm9kZSkgPz8ge31cbiAgICBjb25zdCBsb2NhdGlvbiA9IFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlID8gZW50cnkubm9kZS5sb2NhdGlvbiA6IHJhbmdlcy50eXBlID8/IGVudHJ5Lm93bmVyTG9jYXRpb25cbiAgICBjb25zdCBzb3VyY2VQcm92ZW5hbmNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9ICovICh7XG4gICAgICBvcmlnaW46IHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IFwic291cmNlOjBcIn0sXG4gICAgICByYW5nZXMsXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwiLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH0pXG4gICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgaWQ6IGBub2RlOiR7aW5kZXh9YCxcbiAgICAgIGtpbmQ6IGVudHJ5Lm5vZGUua2luZCxcbiAgICAgIG9yaWdpbjogc291cmNlUHJvdmVuYW5jZS5vcmlnaW4sXG4gICAgICBwYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgcmFuZ2VzOiBzb3VyY2VQcm92ZW5hbmNlLnJhbmdlc1xuICAgIH1cblxuICAgIHJlY29yZHMucHVzaChyZWNvcmQpXG4gICAgcmVjb3Jkc0J5UGF0aC5zZXQoZW50cnkucGF0aCwgcmVjb3JkKVxuICAgIGVudHJ5Lm5vZGUuc291cmNlUHJvdmVuYW5jZSA9IHNvdXJjZVByb3ZlbmFuY2VcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHMgPSByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHNCeVBhdGgpXG5cbiAgbW9kdWxlLnByb3ZlbmFuY2UgPSB7XG4gICAgY29vcmRpbmF0ZVN5c3RlbTogXCJ1dGYxNlwiLFxuICAgIG5vZGVzOiByZWNvcmRzLFxuICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIixcbiAgICBzb3VyY2VzLFxuICAgIHN5bWJvbHMsXG4gICAgdmVyc2lvbjogMVxuICB9XG5cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG4vKipcbiAqIFJlYnVpbGRzIGNhbm9uaWNhbCBnZW5lcmF0aW9uIG1ldGFkYXRhIHdpdGhvdXQgdHJ1c3RpbmcgY2FsbGVyLXByb3ZpZGVkIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119IFtwcm92aWRlZFNvdXJjZXNdIC0gQWRkaXRpb25hbCBzb3VyY2UgY29udGVudC5cbiAqIEByZXR1cm5zIHt7cHJvdmVuYW5jZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb3ZlbmFuY2UsIHJlY29yZEZvcjogKG5vZGU6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlLCBwYXRoPzogc3RyaW5nKSA9PiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2V9fSBDYW5vbmljYWwgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0aW9uSW5kZXgobW9kdWxlLCBwcm92aWRlZFNvdXJjZXMgPSBbXSkge1xuICBjb25zdCBlbnRyaWVzID0gc2VtYW50aWNFbnRyaWVzKG1vZHVsZSlcbiAgY29uc3QgcHJpb3JTb3VyY2VzID0gdXNhYmxlU291cmNlUHJvdmVuYW5jZShtb2R1bGUucHJvdmVuYW5jZSlcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IFtdXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gKi9cbiAgY29uc3QgcHJpb3JTb3VyY2VzQnlJZCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3ZpZGVkU291cmNlcykgYWRkU291cmNlKHNvdXJjZS5maWxlbmFtZSwgc291cmNlLmNvbnRlbnQsIHNvdXJjZS5sYW5ndWFnZSA/PyBudWxsKVxuICBpZiAocHJpb3JTb3VyY2VzKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgcHJpb3JTb3VyY2VzLnNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGFkZFNvdXJjZShzb3VyY2UuZmlsZW5hbWUsIHNvdXJjZS5jb250ZW50LCBzb3VyY2UubGFuZ3VhZ2UpXG5cbiAgICAgIHByaW9yU291cmNlc0J5SWQuc2V0KHNvdXJjZS5pZCwgY2Fub25pY2FsKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlID8gZW50cnkubm9kZS5sb2NhdGlvbiA6IGVudHJ5Lm93bmVyTG9jYXRpb25cblxuICAgIGlmICghc291cmNlcy5zb21lKChzb3VyY2UpID0+IHNvdXJjZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSkpIGFkZFNvdXJjZShsb2NhdGlvbi5maWxlbmFtZSwgbnVsbCwgbnVsbClcbiAgfVxuICBjb25zdCB2ZXJpZmlhYmxlU291cmNlcyA9IHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG5cbiAgLyoqIEB0eXBlIHtNYXA8b2JqZWN0LCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2VbXT59ICovXG4gIGNvbnN0IHJlY29yZHNCeU5vZGUgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSAqL1xuICBjb25zdCByZWNvcmRzQnlQYXRoID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlW119ICovXG4gIGNvbnN0IHJlY29yZHMgPSBbXVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBsb2NhdGVkID0gXCJsb2NhdGlvblwiIGluIGVudHJ5Lm5vZGUgPyBlbnRyeS5ub2RlLmxvY2F0aW9uIDogZW50cnkub3duZXJMb2NhdGlvblxuICAgIGNvbnN0IGFzc29jaWF0ZWQgPSB1c2FibGVOb2RlUHJvdmVuYW5jZShlbnRyeS5ub2RlLnNvdXJjZVByb3ZlbmFuY2UpXG4gICAgY29uc3QgcmFuZ2VzID0gYXNzb2NpYXRlZCA/IHZhbGlkUmFuZ2VzKGFzc29jaWF0ZWQucmFuZ2VzLCB2ZXJpZmlhYmxlU291cmNlcykgOiB7fVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmlnaW4gPSBhc3NvY2lhdGVkXG4gICAgICA/IG5vcm1hbGl6ZU9yaWdpbihhc3NvY2lhdGVkLm9yaWdpbiwgcHJpb3JTb3VyY2VzQnlJZCwgdmVyaWZpYWJsZVNvdXJjZXMpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGZhbGxiYWNrU291cmNlID0gc291cmNlRm9yTG9jYXRpb24obG9jYXRlZCwgc291cmNlcylcbiAgICBjb25zdCBvcmlnaW4gPSBub3JtYWxpemVkT3JpZ2luID8/IHNvdXJjZU9yaWdpbihmYWxsYmFja1NvdXJjZSwgbG9jYXRlZClcblxuICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgIGlkOiBgbm9kZToke2luZGV4fWAsXG4gICAgICBraW5kOiBlbnRyeS5ub2RlLmtpbmQsXG4gICAgICBvcmlnaW4sXG4gICAgICBwYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgcmFuZ2VzXG4gICAgfVxuXG4gICAgcmVjb3Jkcy5wdXNoKHJlY29yZClcbiAgICByZWNvcmRzQnlQYXRoLnNldChlbnRyeS5wYXRoLCByZWNvcmQpXG4gICAgY29uc3Qgb2NjdXJyZW5jZXMgPSByZWNvcmRzQnlOb2RlLmdldChlbnRyeS5ub2RlKSA/PyBbXVxuXG4gICAgb2NjdXJyZW5jZXMucHVzaChyZWNvcmQpXG4gICAgcmVjb3Jkc0J5Tm9kZS5zZXQoZW50cnkubm9kZSwgb2NjdXJyZW5jZXMpXG4gIH1cblxuICBjb25zdCBzeW1ib2xzID0gcmVzb2x2ZVN5bWJvbHMobW9kdWxlLCByZWNvcmRzQnlQYXRoKVxuICBjb25zdCBwcm92ZW5hbmNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZX0gKi8gKHtcbiAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgbm9kZXM6IHJlY29yZHMsXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwiLFxuICAgIHNvdXJjZXMsXG4gICAgc3ltYm9scyxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwcm92ZW5hbmNlLFxuICAgIHJlY29yZEZvcihub2RlLCBwYXRoKSB7XG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IHJlY29yZHNCeU5vZGUuZ2V0KG5vZGUpXG5cbiAgICAgIGlmICghb2NjdXJyZW5jZXMpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VtYW50aWMgbm9kZSBpcyBub3QgcGFydCBvZiB0aGlzIG1vZHVsZS5cIilcbiAgICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gb2NjdXJyZW5jZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUucGF0aCA9PSBwYXRoKVxuXG4gICAgICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2VtYW50aWMgbm9kZSBkb2VzIG5vdCBvY2N1ciBhdCAnJHtwYXRofScuYClcblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgICB9XG4gICAgICBpZiAob2NjdXJyZW5jZXMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTaGFyZWQgc2VtYW50aWMgbm9kZSByZXF1aXJlcyBhbiBvY2N1cnJlbmNlIHBhdGguXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvY2N1cnJlbmNlc1swXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgb25lIGNhbm9uaWNhbCBzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBjb250ZW50IC0gU291cmNlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IENhbm9uaWNhbCBzb3VyY2UuXG4gICAqL1xuICBmdW5jdGlvbiBhZGRTb3VyY2UoZmlsZW5hbWUsIGNvbnRlbnQsIGxhbmd1YWdlKSB7XG4gICAgaWYgKHR5cGVvZiBmaWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IGNvbnRlbnQgIT09IG51bGwgJiYgdHlwZW9mIGNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgbGFuZ3VhZ2UgIT09IG51bGwgJiYgIVtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIiwgXCJweXRob25cIiwgXCJjc2hhcnBcIiwgXCJnb1wiLCBcImNcIiwgXCJjcHBcIl0uaW5jbHVkZXMobGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIHNlbWFudGljIHNvdXJjZSByZWdpc3RyeSBlbnRyeS5cIilcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHNvdXJjZXMuZmluZCgoc291cmNlKSA9PiBzb3VyY2UuZmlsZW5hbWUgPT0gZmlsZW5hbWUgJiYgc291cmNlLmNvbnRlbnQgPT0gY29udGVudClcblxuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG5cbiAgICBjb25zdCByZWdpc3RlcmVkID0ge2NvbnRlbnQsIGZpbGVuYW1lLCBpZDogYHNvdXJjZToke3NvdXJjZXMubGVuZ3RofWAsIGxhbmd1YWdlfVxuXG4gICAgc291cmNlcy5wdXNoKHJlZ2lzdGVyZWQpXG5cbiAgICByZXR1cm4gcmVnaXN0ZXJlZFxuICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgc2FmZSBwcmltYXJ5IG9yaWdpbmFsIGxvY2F0aW9uIGZvciBjbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gUHJpbWFyeSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW1hcnlMb2NhdGlvbihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBvcmlnaW4ubG9jYXRpb25cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNbMF0/LmxvY2F0aW9uXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1swXT8ubG9jYXRpb25cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHNvdXJjZSBtZXRhZGF0YSBvbmx5IHdoZW4gaXQgaXMgYXR0YWNoZWQgdG8gdGhlIHNlbWFudGljIG5vZGUgaXQgZGVzY3JpYmVzLlxuICogUmVnaXN0cnktbG9jYWwgSURzIGFuZCBwYXRocyBhcmUgaW50ZW50aW9uYWxseSBpZ25vcmVkIGFuZCByZWJ1aWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2UgfCB1bmRlZmluZWR9IHJlY29yZCAtIENhbmRpZGF0ZSBub2RlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gVXNhYmxlIGFzc29jaWF0aW9uLlxuICovXG5mdW5jdGlvbiB1c2FibGVOb2RlUHJvdmVuYW5jZShyZWNvcmQpIHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIiB8fCByZWNvcmQudmVyc2lvbiAhPSAxIHx8XG4gICAgIXJlY29yZC5vcmlnaW4gfHwgdHlwZW9mIHJlY29yZC5vcmlnaW4gIT0gXCJvYmplY3RcIiB8fFxuICAgICFyZWNvcmQucmFuZ2VzIHx8IHR5cGVvZiByZWNvcmQucmFuZ2VzICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQucmFuZ2VzKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiByZWNvcmRcbn1cblxuLyoqXG4gKiBSZXRhaW5zIGEgdmFsaWQgc291cmNlIHJlZ2lzdHJ5IGluZGVwZW5kZW50bHkgZnJvbSBwb3RlbnRpYWxseSBzdGFsZSBub2RlIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gcHJvdmVuYW5jZSAtIENhbmRpZGF0ZSBwcm92ZW5hbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlIHwgdW5kZWZpbmVkfSBQcm92ZW5hbmNlIHdpdGggYSB1c2FibGUgc291cmNlIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiB1c2FibGVTb3VyY2VQcm92ZW5hbmNlKHByb3ZlbmFuY2UpIHtcbiAgaWYgKCFwcm92ZW5hbmNlIHx8IHByb3ZlbmFuY2Uuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIgfHwgcHJvdmVuYW5jZS52ZXJzaW9uICE9IDEgfHxcbiAgICBwcm92ZW5hbmNlLmNvb3JkaW5hdGVTeXN0ZW0gIT0gXCJ1dGYxNlwiIHx8ICFBcnJheS5pc0FycmF5KHByb3ZlbmFuY2Uuc291cmNlcykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm92ZW5hbmNlLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlSWRzLmhhcyhzb3VyY2UuaWQpIHx8IHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgc291cmNlLmZpbGVuYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgICBzb3VyY2UuY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2Ygc291cmNlLmNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UubGFuZ3VhZ2UgIT09IG51bGwgJiZcbiAgICAgICFbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCIsIFwicHl0aG9uXCIsIFwiY3NoYXJwXCIsIFwiZ29cIiwgXCJjXCIsIFwiY3BwXCJdLmluY2x1ZGVzKHNvdXJjZS5sYW5ndWFnZSkpIHJldHVybiB1bmRlZmluZWRcbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgfVxuXG4gIHJldHVybiBwcm92ZW5hbmNlXG59XG5cbi8qKlxuICogUmV0YWlucyBvbmx5IHNlbGYtY29uc2lzdGVudCBzb3VyY2UgcmFuZ2VzLlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIENhbmRpZGF0ZSByYW5nZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2Fub25pY2FsIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSBTYWZlIHJhbmdlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRSYW5nZXMocmFuZ2VzLCBzb3VyY2VzKSB7XG4gIGlmICghcmFuZ2VzIHx8IHR5cGVvZiByYW5nZXMgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJhbmdlcykpIHJldHVybiB7fVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj59ICovXG4gIGNvbnN0IHZhbGlkID0ge31cblxuICBmb3IgKGNvbnN0IFtyb2xlLCBsb2NhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmFuZ2VzKSkge1xuICAgIGlmICh2YWxpZExvY2F0aW9uKGxvY2F0aW9uLCBzb3VyY2VzKSkgdmFsaWRbcm9sZV0gPSBsb2NhdGlvblxuICB9XG5cbiAgcmV0dXJuIHZhbGlkXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGNsb3NlZCBvcmlnaW4gd2hpbGUgcmVtYXBwaW5nIHVudHJ1c3RlZCBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2FuZGlkYXRlIG9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gcHJpb3JTb3VyY2VzIC0gUHJpb3ItdG8tY2Fub25pY2FsIHNvdXJjZSBtYXBwaW5nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW4gfCB1bmRlZmluZWR9IFNhZmUgb3JpZ2luLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVPcmlnaW4ob3JpZ2luLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpIHtcbiAgaWYgKCFvcmlnaW4gfHwgdHlwZW9mIG9yaWdpbiAhPSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIgJiYgdmFsaWRMb2NhdGlvbihvcmlnaW4ubG9jYXRpb24sIHNvdXJjZXMpKSB7XG4gICAgY29uc3QgY2xhaW1lZCA9IHByaW9yU291cmNlcy5nZXQob3JpZ2luLnNvdXJjZUlkKVxuICAgIGNvbnN0IHNvdXJjZSA9IGNsYWltZWQgJiYgc291cmNlT3duc0xvY2F0aW9uKGNsYWltZWQsIG9yaWdpbi5sb2NhdGlvbikgPyBjbGFpbWVkIDogc291cmNlRm9yTG9jYXRpb24ob3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VzKVxuXG4gICAgcmV0dXJuIHNvdXJjZU9yaWdpbihzb3VyY2UsIG9yaWdpbi5sb2NhdGlvbilcbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgJiYgQXJyYXkuaXNBcnJheShvcmlnaW4ub3JpZ2lucykgJiYgb3JpZ2luLm9yaWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG9yaWdpbnMgPSBvcmlnaW4ub3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IG5vcm1hbGl6ZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSlcblxuICAgIGlmIChvcmlnaW5zLmV2ZXJ5KEJvb2xlYW4pKSByZXR1cm4ge2tpbmQ6IFwiZGVyaXZlZFwiLCBvcmlnaW5zOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSAqLyAob3JpZ2lucyl9XG4gIH1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic3ludGhldGljXCIgJiYgdHlwZW9mIG9yaWdpbi5yZWFzb24gPT0gXCJzdHJpbmdcIiAmJiBBcnJheS5pc0FycmF5KG9yaWdpbi5yZWxhdGVkT3JpZ2lucykpIHtcbiAgICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IG9yaWdpbi5yZWxhdGVkT3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IG5vcm1hbGl6ZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSlcblxuICAgIGlmIChyZWxhdGVkT3JpZ2lucy5ldmVyeShCb29sZWFuKSkge1xuICAgICAgcmV0dXJuIHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IG9yaWdpbi5yZWFzb24sIHJlbGF0ZWRPcmlnaW5zOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSAqLyAocmVsYXRlZE9yaWdpbnMpfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG9uZSByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gQ2FuZGlkYXRlIHJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBwcmlvclNvdXJjZXMgLSBQcmlvciBzb3VyY2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbiB8IHVuZGVmaW5lZH0gU2FmZSByZWxhdGVkIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVsYXRlZE9yaWdpbihyZWxhdGVkLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpIHtcbiAgaWYgKCFyZWxhdGVkIHx8ICF2YWxpZExvY2F0aW9uKHJlbGF0ZWQubG9jYXRpb24sIHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgY2xhaW1lZCA9IHByaW9yU291cmNlcy5nZXQocmVsYXRlZC5zb3VyY2VJZClcbiAgY29uc3Qgc291cmNlID0gY2xhaW1lZCAmJiBzb3VyY2VPd25zTG9jYXRpb24oY2xhaW1lZCwgcmVsYXRlZC5sb2NhdGlvbikgPyBjbGFpbWVkIDogc291cmNlRm9yTG9jYXRpb24ocmVsYXRlZC5sb2NhdGlvbiwgc291cmNlcylcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtsb2NhdGlvbjogcmVsYXRlZC5sb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH1cblxuICBpZiAodHlwZW9mIHJlbGF0ZWQucm9sZSA9PSBcInN0cmluZ1wiKSBPYmplY3QuYXNzaWduKG5vcm1hbGl6ZWQsIHtyb2xlOiByZWxhdGVkLnJvbGV9KVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQ2hlY2tzIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMgYWdhaW5zdCBleGFjdCBzb3VyY2UgY29udGVudCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gUmVnaXN0ZXJlZCBzb3VyY2VzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvY2F0aW9uIGlzIHNhZmUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkTG9jYXRpb24obG9jYXRpb24sIHNvdXJjZXMpIHtcbiAgaWYgKCFsb2NhdGlvbiB8fCB0eXBlb2YgbG9jYXRpb24uZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIobG9jYXRpb24uZW5kLm9mZnNldCkgfHwgbG9jYXRpb24uc3RhcnQub2Zmc2V0IDwgMCB8fFxuICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgfHwgIXZhbGlkUG9pbnRTaGFwZShsb2NhdGlvbi5zdGFydCkgfHwgIXZhbGlkUG9pbnRTaGFwZShsb2NhdGlvbi5lbmQpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBjYW5kaWRhdGVzID0gc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKVxuXG4gIHJldHVybiBjYW5kaWRhdGVzLnNvbWUoKHNvdXJjZSkgPT4gc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgbG9jYXRpb24pKVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IG9uZSBpZGVudGlmaWVkIHJlZ2lzdHJ5IHNvdXJjZSBvd25zIGEgbm9ybWFsaXplZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBJZGVudGlmaWVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291cmNlIG93bnMgdGhlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBsb2NhdGlvbikge1xuICBpZiAoc291cmNlLmZpbGVuYW1lICE9IGxvY2F0aW9uLmZpbGVuYW1lKSByZXR1cm4gZmFsc2VcbiAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHJldHVybiB0cnVlXG4gIGlmIChsb2NhdGlvbi5lbmQub2Zmc2V0ID4gc291cmNlLmNvbnRlbnQubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgbGV0IGNvb3JkaW5hdGVzID0gc291cmNlQ29vcmRpbmF0ZUluZGV4ZXMuZ2V0KHNvdXJjZSlcblxuICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlLmNvbnRlbnQpXG4gICAgc291cmNlQ29vcmRpbmF0ZUluZGV4ZXMuc2V0KHNvdXJjZSwgY29vcmRpbmF0ZXMpXG4gIH1cblxuICByZXR1cm4gc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpXG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBpbnRlZ2VyIHNoYXBlIG9mIG9uZSBzb3VyY2UgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IHBvaW50IC0gU291cmNlIHBvaW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaXQgaXMgc3RydWN0dXJhbGx5IHZhbGlkLlxuICovXG5mdW5jdGlvbiB2YWxpZFBvaW50U2hhcGUocG9pbnQpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocG9pbnQubGluZSkgJiYgcG9pbnQubGluZSA+PSAxICYmIE51bWJlci5pc0ludGVnZXIocG9pbnQuY29sdW1uKSAmJiBwb2ludC5jb2x1bW4gPj0gMVxufVxuXG4vKipcbiAqIENvbXBhcmVzIG5vcm1hbGl6ZWQgc291cmNlIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBsZWZ0IC0gTGVmdCBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gcmlnaHQgLSBSaWdodCBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGFsbCBjb29yZGluYXRlcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gc2FtZVBvaW50KGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0Lm9mZnNldCA9PSByaWdodC5vZmZzZXQgJiYgbGVmdC5saW5lID09IHJpZ2h0LmxpbmUgJiYgbGVmdC5jb2x1bW4gPT0gcmlnaHQuY29sdW1uXG59XG5cbi8qKlxuICogRmluZHMgdGhlIGRldGVybWluaXN0aWMgc291cmNlIG93bmluZyBhIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYW5vbmljYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IE93bmluZyBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZUZvckxvY2F0aW9uKGxvY2F0aW9uLCBzb3VyY2VzKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBzb3VyY2VPd25zTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG5cbiAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBObyByZWdpc3RlcmVkIHNvdXJjZSBvd25zICR7bG9jYXRpb24uZmlsZW5hbWV9OiR7bG9jYXRpb24uc3RhcnQub2Zmc2V0fS5gKVxuXG4gIHJldHVybiBzb3VyY2Vcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGRpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBTb3VyY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VPcmlnaW59IE9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gc291cmNlT3JpZ2luKHNvdXJjZSwgbG9jYXRpb24pIHtcbiAgcmV0dXJuIHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH1cbn1cblxuLyoqXG4gKiBGaW5kcyBvbmUgbm9kZSBwcm92ZW5hbmNlIHJlY29yZCBieSBzZW1hbnRpYyBvYmplY3Qgb3Igbm9kZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZSB8IHN0cmluZ30gbm9kZSAtIFNlbWFudGljIG9iamVjdCBvciBub2RlIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZX0gUHJvdmVuYW5jZSByZWNvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlUHJvdmVuYW5jZShtb2R1bGUsIG5vZGUpIHtcbiAgcmVxdWlyZVByb3ZlbmFuY2UobW9kdWxlKVxuICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUpXG4gIGNvbnN0IHJlY29yZCA9IHR5cGVvZiBub2RlID09IFwic3RyaW5nXCJcbiAgICA/IGluZGV4LnByb3ZlbmFuY2Uubm9kZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gbm9kZSlcbiAgICA6IGluZGV4LnJlY29yZEZvcihub2RlKVxuXG4gIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBzZW1hbnRpYyBub2RlOiAke25vZGV9YClcblxuICByZXR1cm4gcmVjb3JkXG59XG5cbi8qKlxuICogRmluZHMgb25lIHNlbWFudGljIHN5bWJvbCByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzeW1ib2xJZCAtIFN5bWJvbCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZX0gU3ltYm9sIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbFByb3ZlbmFuY2UobW9kdWxlLCBzeW1ib2xJZCkge1xuICByZXF1aXJlUHJvdmVuYW5jZShtb2R1bGUpXG4gIGNvbnN0IHN5bWJvbCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUpLnByb3ZlbmFuY2Uuc3ltYm9scy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzeW1ib2xJZClcblxuICBpZiAoIXN5bWJvbCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgc3ltYm9sOiAke3N5bWJvbElkfWApXG5cbiAgcmV0dXJuIHN5bWJvbFxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGZyb250ZW5kIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZX0gUHJvdmVuYW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZVByb3ZlbmFuY2UobW9kdWxlKSB7XG4gIGlmICghbW9kdWxlLnByb3ZlbmFuY2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZW1hbnRpYyBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzb3VyY2UgcHJvdmVuYW5jZS5cIilcblxuICByZXR1cm4gbW9kdWxlLnByb3ZlbmFuY2Vcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgcHVibGljIHNlbWFudGljIG5vZGVzIGluIG9uZSBzdGFibGUgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gRW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljRW50cmllcyhtb2R1bGUpIHtcbiAgLyoqIEB0eXBlIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgdmlzaXQobW9kdWxlLCBcIlwiLCBtb2R1bGUubG9jYXRpb24pXG5cbiAgcmV0dXJuIGVudHJpZXNcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBDdXJyZW50IG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ3VycmVudCBKU09OIFBvaW50ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3duZXJMb2NhdGlvbiAtIE5lYXJlc3QgbG9jYXRlZCBvd25lci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChub2RlLCBwYXRoLCBvd25lckxvY2F0aW9uKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiBvd25lckxvY2F0aW9uXG5cbiAgICBlbnRyaWVzLnB1c2goe25vZGUsIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLCBwYXRofSlcblxuICAgIGlmIChub2RlLmtpbmQgPT0gXCJNb2R1bGVcIikge1xuICAgICAgbm9kZS5mdW5jdGlvbnMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYC9mdW5jdGlvbnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICB2aXNpdChub2RlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIiwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpIHtcbiAgICAgIG5vZGUucGFyYW1ldGVycy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkJsb2NrXCIpIHtcbiAgICAgIG5vZGUuc3RhdGVtZW50cy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUGFyYW1ldGVyXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudHlwZSwgYCR7cGF0aH0vdHlwZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICB2aXNpdChub2RlLnR5cGUsIGAke3BhdGh9L3R5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuaW5pdGlhbGl6ZXIsIGAke3BhdGh9L2luaXRpYWxpemVyYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudGFyZ2V0LCBgJHtwYXRofS90YXJnZXRgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgfHwgbm9kZS5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChub2RlLmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmNvbnNlcXVlbnQsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBsb2NhdGlvbilcbiAgICAgIGlmIChub2RlLmFsdGVybmF0ZSkgdmlzaXQobm9kZS5hbHRlcm5hdGUsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiRW50cnlQb2ludFwiKSB7XG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdChub2RlLm9wZXJhbmQsIGAke3BhdGh9L29wZXJhbmRgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdmlzaXQobm9kZS5sZWZ0LCBgJHtwYXRofS9sZWZ0YCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGRlY2xhcmF0aW9ucyBhbmQgcmVmZXJlbmNlcyBhZnRlciBzZW1hbnRpYyB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSByZWNvcmRzIC0gTm9kZSByZWNvcmRzIGJ5IG9jY3VycmVuY2UgcGF0aC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBTeW1ib2xzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHMpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSAqL1xuICBjb25zdCBzeW1ib2xzID0gW11cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgZnVuY3Rpb25zLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJlKGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5uYW1lLCBcImZ1bmN0aW9uXCIsIGAvZnVuY3Rpb25zLyR7aW5kZXh9YCkpXG4gIH1cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25QYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBzY29wZS5zZXQocGFyYW1ldGVyLm5hbWUsIGRlY2xhcmUocGFyYW1ldGVyLCBwYXJhbWV0ZXIubmFtZSwgXCJwYXJhbWV0ZXJcIiwgYCR7ZGVjbGFyYXRpb25QYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCkpXG4gICAgfVxuICAgIHZpc2l0QmxvY2soZGVjbGFyYXRpb24uYm9keSwgc2NvcGUsIGAke2RlY2xhcmF0aW9uUGF0aH0vYm9keWApXG4gIH1cblxuICB2aXNpdEJsb2NrKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIG5ldyBNYXAoKSwgXCIvZW50cnlQb2ludC9ib2R5XCIpXG5cbiAgcmV0dXJuIHN5bWJvbHNcblxuICAvKipcbiAgICogRGVjbGFyZXMgb25lIGNhbm9uaWNhbCBzeW1ib2wuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5QYXJhbWV0ZXIgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb259IG5vZGUgLSBEZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTeW1ib2wgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBraW5kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlY2xhcmF0aW9uIG9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3ltYm9sIGlkZW50aXR5LlxuICAgKi9cbiAgZnVuY3Rpb24gZGVjbGFyZShub2RlLCBuYW1lLCBraW5kLCBwYXRoKSB7XG4gICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkcy5nZXQocGF0aClcblxuICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcHJvdmVuYW5jZSBmb3IgJHtub2RlLmtpbmR9LmApXG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlY29yZC5yYW5nZXMubmFtZSA/PyBub2RlLmxvY2F0aW9uXG4gICAgY29uc3QgaWQgPSBgc3ltYm9sOiR7c3ltYm9scy5sZW5ndGh9YFxuXG4gICAgcmVjb3JkLnN5bWJvbElkID0gaWRcbiAgICBzeW1ib2xzLnB1c2goe2RlY2xhcmF0aW9uTm9kZUlkOiByZWNvcmQuaWQsIGlkLCBraW5kLCBsb2NhdGlvbiwgbmFtZSwgcmVmZXJlbmNlczogW119KVxuXG4gICAgcmV0dXJuIGlkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBvbmUgbGV4aWNhbCBibG9jay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHBhcmVudCAtIFZpc2libGUgYmluZGluZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gU3RhdGVtZW50IHNlcXVlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRCbG9jayhibG9jaywgcGFyZW50LCBwYXRoKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwKHBhcmVudClcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGF0ZW1lbnRdIG9mIGJsb2NrLnN0YXRlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRQYXRoID0gYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWBcblxuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmApXG4gICAgICAgIHNjb3BlLnNldChzdGF0ZW1lbnQubmFtZSwgZGVjbGFyZShzdGF0ZW1lbnQsIHN0YXRlbWVudC5uYW1lLCBcImxvY2FsXCIsIHN0YXRlbWVudFBhdGgpKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgICByZWZlcmVuY2Uoc3RhdGVtZW50LnRhcmdldCwgc2NvcGUuZ2V0KHN0YXRlbWVudC50YXJnZXQubmFtZSksIFwid3JpdGVcIiwgYCR7c3RhdGVtZW50UGF0aH0vdGFyZ2V0YClcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmApXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9jb25kaXRpb25gKVxuICAgICAgICB2aXNpdEJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vY29uc2VxdWVudGApXG4gICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdEJsb2NrKHN0YXRlbWVudC5hbHRlcm5hdGUsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9hbHRlcm5hdGVgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyByZWZlcmVuY2VzIGluIG9uZSBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gc2NvcGUgLSBWaXNpYmxlIGJpbmRpbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4cHJlc3Npb24gb2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLCBzY29wZSwgcGF0aCkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZWZlcmVuY2UoZXhwcmVzc2lvbiwgc2NvcGUuZ2V0KGV4cHJlc3Npb24ubmFtZSksIFwicmVhZFwiLCBwYXRoKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJlZmVyZW5jZShleHByZXNzaW9uLCBmdW5jdGlvbnMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKSwgXCJjYWxsXCIsIHBhdGgpXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYXJndW1lbnRdIG9mIGV4cHJlc3Npb24uYXJndW1lbnRzLmVudHJpZXMoKSkgdmlzaXRFeHByZXNzaW9uKGFyZ3VtZW50LCBzY29wZSwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5vcGVyYW5kLCBzY29wZSwgYCR7cGF0aH0vb3BlcmFuZGApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmxlZnQsIHNjb3BlLCBgJHtwYXRofS9sZWZ0YClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnJpZ2h0LCBzY29wZSwgYCR7cGF0aH0vcmlnaHRgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBvbmUgcmVzb2x2ZWQgc3ltYm9sIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLklkZW50aWZpZXJFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbn0gbm9kZSAtIFJlZmVyZW5jZSBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gc3ltYm9sSWQgLSBSZXNvbHZlZCBzeW1ib2wuXG4gICAqIEBwYXJhbSB7XCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcImNhbGxcIn0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFJlZmVyZW5jZSBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVmZXJlbmNlKG5vZGUsIHN5bWJvbElkLCByb2xlLCBwYXRoKSB7XG4gICAgaWYgKCFzeW1ib2xJZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzLmdldChwYXRoKVxuICAgIGNvbnN0IHN5bWJvbCA9IHN5bWJvbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gc3ltYm9sSWQpXG5cbiAgICBpZiAoIXJlY29yZCB8fCAhc3ltYm9sKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcHJvdmVuYW5jZSB3aGlsZSByZXNvbHZpbmcgJHtub2RlLmtpbmR9LmApXG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlY29yZC5yYW5nZXNbcm9sZSA9PSBcImNhbGxcIiA/IFwiY2FsbGVlXCIgOiBcIm5hbWVcIl0gPz8gbm9kZS5sb2NhdGlvblxuXG4gICAgcmVjb3JkLnN5bWJvbElkID0gc3ltYm9sSWRcbiAgICBzeW1ib2wucmVmZXJlbmNlcy5wdXNoKHtsb2NhdGlvbiwgbm9kZUlkOiByZWNvcmQuaWQsIHJvbGV9KVxuICB9XG59XG4iXX0=
1019
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVuYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFBO0FBRW5FLDZGQUE2RjtBQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVHQUF1RztBQUN2RyxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNO0lBQzFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU07SUFDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUU3QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUk7SUFDdkMsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDdkMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDdkUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0s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SSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3pFLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ2pELFNBQVMsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3pFLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ2pELGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksV0FBVyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hELGVBQWUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUE7UUFDL0QsQ0FBQzthQUFNLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ2pELGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUE7WUFDdkQsZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQTtRQUMzRCxDQUFDO2FBQU0sSUFBSSxVQUFVLENB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QUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUVsSCxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUMxQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkUG9pbnRBdH0gZnJvbSBcIi4vbG9jYXRpb24uanNcIlxuXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj4+fSAqL1xuY29uc3QgcGFyc2VyUmFuZ2VzID0gbmV3IFdlYWtNYXAoKVxuLyoqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZSwgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59ICovXG5jb25zdCBzb3VyY2VDb29yZGluYXRlSW5kZXhlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBSZWNvcmRzIHBhcnNlci1wcm92aWRlZCBzZW1hbnRpYy10b2tlbiByYW5nZXMgd2l0aG91dCBleHBvc2luZyBwYXJzZXIgdHJlZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gbm9kZSAtIFNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgcm9sZSByYW5nZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgcGFyc2VyUmFuZ2VzLnNldChub2RlLCByYW5nZXMpXG59XG5cbi8qKlxuICogUmVjb3JkcyBwYXJzZXIgcmFuZ2VzIGFuZCByZXR1cm5zIHRoZSBzYW1lIHNlbWFudGljIG5vZGUuXG4gKiBAdGVtcGxhdGUge29iamVjdH0gTm9kZVxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCByb2xlIHJhbmdlcy5cbiAqIEByZXR1cm5zIHtOb2RlfSBUaGUgc2FtZSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgc2V0UGFyc2VyUmFuZ2VzKG5vZGUsIHJhbmdlcylcblxuICByZXR1cm4gbm9kZVxufVxuXG4vKipcbiAqIFJldHVybnMgb25lIHBhcnNlci1vd25lZCB0b2tlbiByYW5nZSB3aGlsZSBmcm9udGVuZCB2YWxpZGF0aW9uIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICogQHBhcmFtIHtvYmplY3R9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9yIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBFeGFjdCBzZW1hbnRpYyB0b2tlbiByb2xlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWR9IFBhcnNlciByYW5nZSB3aGVuIHByZXNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZXJSYW5nZUZvcihub2RlLCByb2xlKSB7XG4gIHJldHVybiBwYXJzZXJSYW5nZXMuZ2V0KG5vZGUpPy5bcm9sZV1cbn1cblxuLyoqXG4gKiBBZGRzIGRldGVybWluaXN0aWMgcHJvdmVuYW5jZSB0byBhIHZhbGlkYXRlZCBmcm9udGVuZCBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gc291cmNlIC0gUGFyc2VkIHNvdXJjZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UuZmlsZW5hbWUgLSBTb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gc291cmNlLmxhbmd1YWdlIC0gU291cmNlIGxhbmd1YWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZS5zb3VyY2UgLSBFeGFjdCBzb3VyY2UgY29udGVudC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBUaGUgc2FtZSBzZW1hbnRpYyBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0ZVBhcnNlZE1vZHVsZShtb2R1bGUsIHtmaWxlbmFtZSwgbGFuZ3VhZ2UsIHNvdXJjZX0pIHtcbiAgY29uc3Qgc291cmNlcyA9IFt7Y29udGVudDogc291cmNlLCBmaWxlbmFtZSwgaWQ6IFwic291cmNlOjBcIiwgbGFuZ3VhZ2V9XVxuICBjb25zdCBlbnRyaWVzID0gc2VtYW50aWNFbnRyaWVzKG1vZHVsZSlcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSAqL1xuICBjb25zdCByZWNvcmRzQnlQYXRoID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlW119ICovXG4gIGNvbnN0IHJlY29yZHMgPSBbXVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByYW5nZXMgPSBwYXJzZXJSYW5nZXMuZ2V0KGVudHJ5Lm5vZGUpID8/IHt9XG4gICAgY29uc3QgbG9jYXRpb24gPSBcImxvY2F0aW9uXCIgaW4gZW50cnkubm9kZSA/IGVudHJ5Lm5vZGUubG9jYXRpb24gOiByYW5nZXMudHlwZSA/PyBlbnRyeS5vd25lckxvY2F0aW9uXG4gICAgY29uc3QgcmVsYXRlZCA9IHtsb2NhdGlvbiwgc291cmNlSWQ6IFwic291cmNlOjBcIn1cbiAgICBjb25zdCBvcmlnaW4gPSBlbnRyeS5wYXRoLnN0YXJ0c1dpdGgoXCIvY2FwYWJpbGl0aWVzL1wiKVxuICAgICAgPyB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3ludGhldGljXCIpLCByZWFzb246IFwiY29tcGlsZXItYXV0aG9yaXplZCBjYXBhYmlsaXR5XCIsIHJlbGF0ZWRPcmlnaW5zOiBbcmVsYXRlZF19XG4gICAgICA6IGVudHJ5Lm5vZGUua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIiB8fCBlbnRyeS5ub2RlLmtpbmQgPT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIlxuICAgICAgICA/IHtraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJkZXJpdmVkXCIpLCBvcmlnaW5zOiBbcmVsYXRlZF19XG4gICAgICAgIDoge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInNvdXJjZVwiKSwgbG9jYXRpb24sIHNvdXJjZUlkOiBcInNvdXJjZTowXCJ9XG4gICAgY29uc3Qgc291cmNlUHJvdmVuYW5jZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSAqLyAoe1xuICAgICAgb3JpZ2luLFxuICAgICAgcmFuZ2VzLFxuICAgICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIixcbiAgICAgIHZlcnNpb246IDFcbiAgICB9KVxuICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgIGlkOiBgbm9kZToke2luZGV4fWAsXG4gICAgICBraW5kOiBlbnRyeS5ub2RlLmtpbmQsXG4gICAgICBvcmlnaW46IHNvdXJjZVByb3ZlbmFuY2Uub3JpZ2luLFxuICAgICAgcGF0aDogZW50cnkucGF0aCxcbiAgICAgIHJhbmdlczogc291cmNlUHJvdmVuYW5jZS5yYW5nZXNcbiAgICB9XG5cbiAgICByZWNvcmRzLnB1c2gocmVjb3JkKVxuICAgIHJlY29yZHNCeVBhdGguc2V0KGVudHJ5LnBhdGgsIHJlY29yZClcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShlbnRyeS5ub2RlKSkgUmVmbGVjdC5zZXQoZW50cnkubm9kZSwgXCJzb3VyY2VQcm92ZW5hbmNlXCIsIHNvdXJjZVByb3ZlbmFuY2UpXG4gIH1cblxuICBjb25zdCBzeW1ib2xzID0gcmVzb2x2ZVN5bWJvbHMobW9kdWxlLCByZWNvcmRzQnlQYXRoKVxuXG4gIG1vZHVsZS5wcm92ZW5hbmNlID0ge1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBub2RlczogcmVjb3JkcyxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIsXG4gICAgc291cmNlcyxcbiAgICBzeW1ib2xzLFxuICAgIHZlcnNpb246IDFcbiAgfVxuXG4gIHJldHVybiBtb2R1bGVcbn1cblxuLyoqXG4gKiBSZWJ1aWxkcyBjYW5vbmljYWwgZ2VuZXJhdGlvbiBtZXRhZGF0YSB3aXRob3V0IHRydXN0aW5nIGNhbGxlci1wcm92aWRlZCBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxhbmd1YWdlPzogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbcHJvdmlkZWRTb3VyY2VzXSAtIEFkZGl0aW9uYWwgc291cmNlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyB7e3Byb3ZlbmFuY2U6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlLCByZWNvcmRGb3I6IChub2RlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZSwgcGF0aD86IHN0cmluZykgPT4gaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlfX0gQ2Fub25pY2FsIGluZGV4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgcHJvdmlkZWRTb3VyY2VzID0gW10pIHtcbiAgY29uc3QgZW50cmllcyA9IHNlbWFudGljRW50cmllcyhtb2R1bGUpXG4gIGNvbnN0IHByaW9yU291cmNlcyA9IHVzYWJsZVNvdXJjZVByb3ZlbmFuY2UobW9kdWxlLnByb3ZlbmFuY2UpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119ICovXG4gIGNvbnN0IHNvdXJjZXMgPSBbXVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59ICovXG4gIGNvbnN0IHByaW9yU291cmNlc0J5SWQgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm92aWRlZFNvdXJjZXMpIGFkZFNvdXJjZShzb3VyY2UuZmlsZW5hbWUsIHNvdXJjZS5jb250ZW50LCBzb3VyY2UubGFuZ3VhZ2UgPz8gbnVsbClcbiAgaWYgKHByaW9yU291cmNlcykge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHByaW9yU291cmNlcy5zb3VyY2VzKSB7XG4gICAgICBjb25zdCBjYW5vbmljYWwgPSBhZGRTb3VyY2Uoc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudCwgc291cmNlLmxhbmd1YWdlKVxuXG4gICAgICBwcmlvclNvdXJjZXNCeUlkLnNldChzb3VyY2UuaWQsIGNhbm9uaWNhbClcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBcImxvY2F0aW9uXCIgaW4gZW50cnkubm9kZSA/IGVudHJ5Lm5vZGUubG9jYXRpb24gOiBlbnRyeS5vd25lckxvY2F0aW9uXG5cbiAgICBpZiAoIXNvdXJjZXMuc29tZSgoc291cmNlKSA9PiBzb3VyY2UuZmlsZW5hbWUgPT0gbG9jYXRpb24uZmlsZW5hbWUpKSBhZGRTb3VyY2UobG9jYXRpb24uZmlsZW5hbWUsIG51bGwsIG51bGwpXG4gIH1cbiAgY29uc3QgdmVyaWZpYWJsZVNvdXJjZXMgPSBzb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuY29udGVudCAhPSBudWxsKVxuXG4gIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlW10+fSAqL1xuICBjb25zdCByZWNvcmRzQnlOb2RlID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlPn0gKi9cbiAgY29uc3QgcmVjb3Jkc0J5UGF0aCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSAqL1xuICBjb25zdCByZWNvcmRzID0gW11cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGVudHJpZXMuZW50cmllcygpKSB7XG4gICAgY29uc3QgbG9jYXRlZCA9IFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlID8gZW50cnkubm9kZS5sb2NhdGlvbiA6IGVudHJ5Lm93bmVyTG9jYXRpb25cbiAgICBjb25zdCBhc3NvY2lhdGVkID0gdXNhYmxlTm9kZVByb3ZlbmFuY2UoUmVmbGVjdC5nZXQoZW50cnkubm9kZSwgXCJzb3VyY2VQcm92ZW5hbmNlXCIpKVxuICAgIGNvbnN0IHJhbmdlcyA9IGFzc29jaWF0ZWQgPyB2YWxpZFJhbmdlcyhhc3NvY2lhdGVkLnJhbmdlcywgdmVyaWZpYWJsZVNvdXJjZXMpIDoge31cbiAgICBjb25zdCBub3JtYWxpemVkT3JpZ2luID0gYXNzb2NpYXRlZFxuICAgICAgPyBub3JtYWxpemVPcmlnaW4oYXNzb2NpYXRlZC5vcmlnaW4sIHByaW9yU291cmNlc0J5SWQsIHZlcmlmaWFibGVTb3VyY2VzKVxuICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCBmYWxsYmFja1NvdXJjZSA9IHNvdXJjZUZvckxvY2F0aW9uKGxvY2F0ZWQsIHNvdXJjZXMpXG4gICAgY29uc3Qgb3JpZ2luID0gZW50cnkucGF0aC5zdGFydHNXaXRoKFwiL2NhcGFiaWxpdGllcy9cIilcbiAgICAgID8ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcInN5bnRoZXRpY1wiKSwgcmVhc29uOiBcImNvbXBpbGVyLWF1dGhvcml6ZWQgY2FwYWJpbGl0eVwiLFxuICAgICAgICByZWxhdGVkT3JpZ2luczogW3tsb2NhdGlvbjogbG9jYXRlZCwgc291cmNlSWQ6IGZhbGxiYWNrU291cmNlLmlkfV19XG4gICAgICA6IG5vcm1hbGl6ZWRPcmlnaW4gPz8gc291cmNlT3JpZ2luKGZhbGxiYWNrU291cmNlLCBsb2NhdGVkKVxuXG4gICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgaWQ6IGBub2RlOiR7aW5kZXh9YCxcbiAgICAgIGtpbmQ6IGVudHJ5Lm5vZGUua2luZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICByYW5nZXNcbiAgICB9XG5cbiAgICByZWNvcmRzLnB1c2gocmVjb3JkKVxuICAgIHJlY29yZHNCeVBhdGguc2V0KGVudHJ5LnBhdGgsIHJlY29yZClcbiAgICBjb25zdCBvY2N1cnJlbmNlcyA9IHJlY29yZHNCeU5vZGUuZ2V0KGVudHJ5Lm5vZGUpID8/IFtdXG5cbiAgICBvY2N1cnJlbmNlcy5wdXNoKHJlY29yZClcbiAgICByZWNvcmRzQnlOb2RlLnNldChlbnRyeS5ub2RlLCBvY2N1cnJlbmNlcylcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHMgPSByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHNCeVBhdGgpXG4gIGNvbnN0IHByb3ZlbmFuY2UgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlfSAqLyAoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBub2RlczogcmVjb3JkcyxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIsXG4gICAgc291cmNlcyxcbiAgICBzeW1ib2xzLFxuICAgIHZlcnNpb246IDFcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIHByb3ZlbmFuY2UsXG4gICAgcmVjb3JkRm9yKG5vZGUsIHBhdGgpIHtcbiAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gcmVjb3Jkc0J5Tm9kZS5nZXQobm9kZSlcblxuICAgICAgaWYgKCFvY2N1cnJlbmNlcykgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTZW1hbnRpYyBub2RlIGlzIG5vdCBwYXJ0IG9mIHRoaXMgbW9kdWxlLlwiKVxuICAgICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBvY2N1cnJlbmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5wYXRoID09IHBhdGgpXG5cbiAgICAgICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBTZW1hbnRpYyBub2RlIGRvZXMgbm90IG9jY3VyIGF0ICcke3BhdGh9Jy5gKVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICAgIH1cbiAgICAgIGlmIChvY2N1cnJlbmNlcy5sZW5ndGggIT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNoYXJlZCBzZW1hbnRpYyBub2RlIHJlcXVpcmVzIGFuIG9jY3VycmVuY2UgcGF0aC5cIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9jY3VycmVuY2VzWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBvbmUgY2Fub25pY2FsIHNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBTb3VyY2UgY29udGVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gQ2Fub25pY2FsIHNvdXJjZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFNvdXJjZShmaWxlbmFtZSwgY29udGVudCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAodHlwZW9mIGZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2YgY29udGVudCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICBsYW5ndWFnZSAhPT0gbnVsbCAmJiAhW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiLCBcImtvdGxpblwiLCBcInB5dGhvblwiLCBcImNzaGFycFwiLCBcImdvXCIsIFwiY1wiLCBcImNwcFwiLCBcInJ1c3RcIiwgXCJzd2lmdFwiLCBcImRhcnRcIl0uaW5jbHVkZXMobGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIHNlbWFudGljIHNvdXJjZSByZWdpc3RyeSBlbnRyeS5cIilcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHNvdXJjZXMuZmluZCgoc291cmNlKSA9PiBzb3VyY2UuZmlsZW5hbWUgPT0gZmlsZW5hbWUgJiYgc291cmNlLmNvbnRlbnQgPT0gY29udGVudClcblxuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG5cbiAgICBjb25zdCByZWdpc3RlcmVkID0ge2NvbnRlbnQsIGZpbGVuYW1lLCBpZDogYHNvdXJjZToke3NvdXJjZXMubGVuZ3RofWAsIGxhbmd1YWdlfVxuXG4gICAgc291cmNlcy5wdXNoKHJlZ2lzdGVyZWQpXG5cbiAgICByZXR1cm4gcmVnaXN0ZXJlZFxuICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgc2FmZSBwcmltYXJ5IG9yaWdpbmFsIGxvY2F0aW9uIGZvciBjbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gUHJpbWFyeSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW1hcnlMb2NhdGlvbihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBvcmlnaW4ubG9jYXRpb25cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNbMF0/LmxvY2F0aW9uXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1swXT8ubG9jYXRpb25cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHNvdXJjZSBtZXRhZGF0YSBvbmx5IHdoZW4gaXQgaXMgYXR0YWNoZWQgdG8gdGhlIHNlbWFudGljIG5vZGUgaXQgZGVzY3JpYmVzLlxuICogUmVnaXN0cnktbG9jYWwgSURzIGFuZCBwYXRocyBhcmUgaW50ZW50aW9uYWxseSBpZ25vcmVkIGFuZCByZWJ1aWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2UgfCB1bmRlZmluZWR9IHJlY29yZCAtIENhbmRpZGF0ZSBub2RlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gVXNhYmxlIGFzc29jaWF0aW9uLlxuICovXG5mdW5jdGlvbiB1c2FibGVOb2RlUHJvdmVuYW5jZShyZWNvcmQpIHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIiB8fCByZWNvcmQudmVyc2lvbiAhPSAxIHx8XG4gICAgIXJlY29yZC5vcmlnaW4gfHwgdHlwZW9mIHJlY29yZC5vcmlnaW4gIT0gXCJvYmplY3RcIiB8fFxuICAgICFyZWNvcmQucmFuZ2VzIHx8IHR5cGVvZiByZWNvcmQucmFuZ2VzICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQucmFuZ2VzKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiByZWNvcmRcbn1cblxuLyoqXG4gKiBSZXRhaW5zIGEgdmFsaWQgc291cmNlIHJlZ2lzdHJ5IGluZGVwZW5kZW50bHkgZnJvbSBwb3RlbnRpYWxseSBzdGFsZSBub2RlIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gcHJvdmVuYW5jZSAtIENhbmRpZGF0ZSBwcm92ZW5hbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlIHwgdW5kZWZpbmVkfSBQcm92ZW5hbmNlIHdpdGggYSB1c2FibGUgc291cmNlIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiB1c2FibGVTb3VyY2VQcm92ZW5hbmNlKHByb3ZlbmFuY2UpIHtcbiAgaWYgKCFwcm92ZW5hbmNlIHx8IHByb3ZlbmFuY2Uuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIgfHwgcHJvdmVuYW5jZS52ZXJzaW9uICE9IDEgfHxcbiAgICBwcm92ZW5hbmNlLmNvb3JkaW5hdGVTeXN0ZW0gIT0gXCJ1dGYxNlwiIHx8ICFBcnJheS5pc0FycmF5KHByb3ZlbmFuY2Uuc291cmNlcykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm92ZW5hbmNlLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlSWRzLmhhcyhzb3VyY2UuaWQpIHx8IHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgc291cmNlLmZpbGVuYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgICBzb3VyY2UuY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2Ygc291cmNlLmNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UubGFuZ3VhZ2UgIT09IG51bGwgJiZcbiAgICAgICFbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCIsIFwia290bGluXCIsIFwicHl0aG9uXCIsIFwiY3NoYXJwXCIsIFwiZ29cIiwgXCJjXCIsIFwiY3BwXCIsIFwicnVzdFwiLCBcInN3aWZ0XCIsIFwiZGFydFwiXS5pbmNsdWRlcyhzb3VyY2UubGFuZ3VhZ2UpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgc291cmNlSWRzLmFkZChzb3VyY2UuaWQpXG4gIH1cblxuICByZXR1cm4gcHJvdmVuYW5jZVxufVxuXG4vKipcbiAqIFJldGFpbnMgb25seSBzZWxmLWNvbnNpc3RlbnQgc291cmNlIHJhbmdlcy5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBDYW5kaWRhdGUgcmFuZ2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pn0gU2FmZSByYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkUmFuZ2VzKHJhbmdlcywgc291cmNlcykge1xuICBpZiAoIXJhbmdlcyB8fCB0eXBlb2YgcmFuZ2VzICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyYW5nZXMpKSByZXR1cm4ge31cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+fSAqL1xuICBjb25zdCB2YWxpZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbcm9sZSwgbG9jYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJhbmdlcykpIHtcbiAgICBpZiAodmFsaWRMb2NhdGlvbihsb2NhdGlvbiwgc291cmNlcykpIHZhbGlkW3JvbGVdID0gbG9jYXRpb25cbiAgfVxuXG4gIHJldHVybiB2YWxpZFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBjbG9zZWQgb3JpZ2luIHdoaWxlIHJlbWFwcGluZyB1bnRydXN0ZWQgc291cmNlIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENhbmRpZGF0ZSBvcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHByaW9yU291cmNlcyAtIFByaW9yLXRvLWNhbm9uaWNhbCBzb3VyY2UgbWFwcGluZy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYW5vbmljYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2luIHwgdW5kZWZpbmVkfSBTYWZlIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT3JpZ2luKG9yaWdpbiwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSB7XG4gIGlmICghb3JpZ2luIHx8IHR5cGVvZiBvcmlnaW4gIT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInNvdXJjZVwiICYmIHZhbGlkTG9jYXRpb24ob3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VzKSkge1xuICAgIGNvbnN0IGNsYWltZWQgPSBwcmlvclNvdXJjZXMuZ2V0KG9yaWdpbi5zb3VyY2VJZClcbiAgICBjb25zdCBzb3VyY2UgPSBjbGFpbWVkICYmIHNvdXJjZU93bnNMb2NhdGlvbihjbGFpbWVkLCBvcmlnaW4ubG9jYXRpb24pID8gY2xhaW1lZCA6IHNvdXJjZUZvckxvY2F0aW9uKG9yaWdpbi5sb2NhdGlvbiwgc291cmNlcylcblxuICAgIHJldHVybiBzb3VyY2VPcmlnaW4oc291cmNlLCBvcmlnaW4ubG9jYXRpb24pXG4gIH1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiICYmIEFycmF5LmlzQXJyYXkob3JpZ2luLm9yaWdpbnMpICYmIG9yaWdpbi5vcmlnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBvcmlnaW5zID0gb3JpZ2luLm9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiBub3JtYWxpemVSZWxhdGVkT3JpZ2luKHJlbGF0ZWQsIHByaW9yU291cmNlcywgc291cmNlcykpXG5cbiAgICBpZiAob3JpZ2lucy5ldmVyeShCb29sZWFuKSkgcmV0dXJuIHtraW5kOiBcImRlcml2ZWRcIiwgb3JpZ2luczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gKi8gKG9yaWdpbnMpfVxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcInN5bnRoZXRpY1wiICYmIHR5cGVvZiBvcmlnaW4ucmVhc29uID09IFwic3RyaW5nXCIgJiYgQXJyYXkuaXNBcnJheShvcmlnaW4ucmVsYXRlZE9yaWdpbnMpKSB7XG4gICAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSBvcmlnaW4ucmVsYXRlZE9yaWdpbnMubWFwKChyZWxhdGVkKSA9PiBub3JtYWxpemVSZWxhdGVkT3JpZ2luKHJlbGF0ZWQsIHByaW9yU291cmNlcywgc291cmNlcykpXG5cbiAgICBpZiAocmVsYXRlZE9yaWdpbnMuZXZlcnkoQm9vbGVhbikpIHtcbiAgICAgIHJldHVybiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uOiBvcmlnaW4ucmVhc29uLCByZWxhdGVkT3JpZ2luczogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gKi8gKHJlbGF0ZWRPcmlnaW5zKX1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBvbmUgcmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gcmVsYXRlZCAtIENhbmRpZGF0ZSByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gcHJpb3JTb3VyY2VzIC0gUHJpb3Igc291cmNlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYW5vbmljYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW4gfCB1bmRlZmluZWR9IFNhZmUgcmVsYXRlZCBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSB7XG4gIGlmICghcmVsYXRlZCB8fCAhdmFsaWRMb2NhdGlvbihyZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNsYWltZWQgPSBwcmlvclNvdXJjZXMuZ2V0KHJlbGF0ZWQuc291cmNlSWQpXG4gIGNvbnN0IHNvdXJjZSA9IGNsYWltZWQgJiYgc291cmNlT3duc0xvY2F0aW9uKGNsYWltZWQsIHJlbGF0ZWQubG9jYXRpb24pID8gY2xhaW1lZCA6IHNvdXJjZUZvckxvY2F0aW9uKHJlbGF0ZWQubG9jYXRpb24sIHNvdXJjZXMpXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7bG9jYXRpb246IHJlbGF0ZWQubG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9XG5cbiAgaWYgKHR5cGVvZiByZWxhdGVkLnJvbGUgPT0gXCJzdHJpbmdcIikgT2JqZWN0LmFzc2lnbihub3JtYWxpemVkLCB7cm9sZTogcmVsYXRlZC5yb2xlfSlcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIENoZWNrcyBub3JtYWxpemVkIGNvb3JkaW5hdGVzIGFnYWluc3QgZXhhY3Qgc291cmNlIGNvbnRlbnQgd2hlbiBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ2FuZGlkYXRlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIFJlZ2lzdGVyZWQgc291cmNlcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBsb2NhdGlvbiBpcyBzYWZlLlxuICovXG5mdW5jdGlvbiB2YWxpZExvY2F0aW9uKGxvY2F0aW9uLCBzb3VyY2VzKSB7XG4gIGlmICghbG9jYXRpb24gfHwgdHlwZW9mIGxvY2F0aW9uLmZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgIWxvY2F0aW9uLnN0YXJ0IHx8ICFsb2NhdGlvbi5lbmQgfHxcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihsb2NhdGlvbi5zdGFydC5vZmZzZXQpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGxvY2F0aW9uLmVuZC5vZmZzZXQpIHx8IGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCA8IDAgfHxcbiAgICBsb2NhdGlvbi5lbmQub2Zmc2V0IDwgbG9jYXRpb24uc3RhcnQub2Zmc2V0IHx8ICF2YWxpZFBvaW50U2hhcGUobG9jYXRpb24uc3RhcnQpIHx8ICF2YWxpZFBvaW50U2hhcGUobG9jYXRpb24uZW5kKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICByZXR1cm4gY2FuZGlkYXRlcy5zb21lKChzb3VyY2UpID0+IHNvdXJjZU93bnNMb2NhdGlvbihzb3VyY2UsIGxvY2F0aW9uKSlcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBvbmUgaWRlbnRpZmllZCByZWdpc3RyeSBzb3VyY2Ugb3ducyBhIG5vcm1hbGl6ZWQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gSWRlbnRpZmllZCBzb3VyY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ2FuZGlkYXRlIGxvY2F0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHNvdXJjZSBvd25zIHRoZSBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgbG9jYXRpb24pIHtcbiAgaWYgKHNvdXJjZS5maWxlbmFtZSAhPSBsb2NhdGlvbi5maWxlbmFtZSkgcmV0dXJuIGZhbHNlXG4gIGlmIChzb3VyY2UuY29udGVudCA9PSBudWxsKSByZXR1cm4gdHJ1ZVxuICBpZiAobG9jYXRpb24uZW5kLm9mZnNldCA+IHNvdXJjZS5jb250ZW50Lmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gIGxldCBjb29yZGluYXRlcyA9IHNvdXJjZUNvb3JkaW5hdGVJbmRleGVzLmdldChzb3VyY2UpXG5cbiAgaWYgKCFjb29yZGluYXRlcykge1xuICAgIGNvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KHNvdXJjZS5jb250ZW50KVxuICAgIHNvdXJjZUNvb3JkaW5hdGVJbmRleGVzLnNldChzb3VyY2UsIGNvb3JkaW5hdGVzKVxuICB9XG5cbiAgcmV0dXJuIHNhbWVQb2ludChpbmRleGVkUG9pbnRBdChjb29yZGluYXRlcywgbG9jYXRpb24uc3RhcnQub2Zmc2V0KSwgbG9jYXRpb24uc3RhcnQpICYmXG4gICAgc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5lbmQub2Zmc2V0KSwgbG9jYXRpb24uZW5kKVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgaW50ZWdlciBzaGFwZSBvZiBvbmUgc291cmNlIHBvaW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBwb2ludCAtIFNvdXJjZSBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGl0IGlzIHN0cnVjdHVyYWxseSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRQb2ludFNoYXBlKHBvaW50KSB7XG4gIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBvaW50LmxpbmUpICYmIHBvaW50LmxpbmUgPj0gMSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBvaW50LmNvbHVtbikgJiYgcG9pbnQuY29sdW1uID49IDFcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBub3JtYWxpemVkIHNvdXJjZSBjb29yZGluYXRlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gbGVmdCAtIExlZnQgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IHJpZ2h0IC0gUmlnaHQgcG9pbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBhbGwgY29vcmRpbmF0ZXMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIHNhbWVQb2ludChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gbGVmdC5vZmZzZXQgPT0gcmlnaHQub2Zmc2V0ICYmIGxlZnQubGluZSA9PSByaWdodC5saW5lICYmIGxlZnQuY29sdW1uID09IHJpZ2h0LmNvbHVtblxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBkZXRlcm1pbmlzdGljIHNvdXJjZSBvd25pbmcgYSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2Fub25pY2FsIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBPd25pbmcgc291cmNlLlxuICovXG5mdW5jdGlvbiBzb3VyY2VGb3JMb2NhdGlvbihsb2NhdGlvbiwgc291cmNlcykge1xuICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gc291cmNlT3duc0xvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuXG4gIGlmICghc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gcmVnaXN0ZXJlZCBzb3VyY2Ugb3ducyAke2xvY2F0aW9uLmZpbGVuYW1lfToke2xvY2F0aW9uLnN0YXJ0Lm9mZnNldH0uYClcblxuICByZXR1cm4gc291cmNlXG59XG5cbi8qKlxuICogQ3JlYXRlcyBkaXJlY3Qgc291cmNlIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gc291cmNlIC0gU291cmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIExvY2F0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlT3JpZ2lufSBPcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZU9yaWdpbihzb3VyY2UsIGxvY2F0aW9uKSB7XG4gIHJldHVybiB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9XG59XG5cbi8qKlxuICogRmluZHMgb25lIG5vZGUgcHJvdmVuYW5jZSByZWNvcmQgYnkgc2VtYW50aWMgb2JqZWN0IG9yIG5vZGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUgfCBzdHJpbmd9IG5vZGUgLSBTZW1hbnRpYyBvYmplY3Qgb3Igbm9kZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2V9IFByb3ZlbmFuY2UgcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZVByb3ZlbmFuY2UobW9kdWxlLCBub2RlKSB7XG4gIHJlcXVpcmVQcm92ZW5hbmNlKG1vZHVsZSlcbiAgY29uc3QgaW5kZXggPSBjcmVhdGVHZW5lcmF0aW9uSW5kZXgobW9kdWxlKVxuICBjb25zdCByZWNvcmQgPSB0eXBlb2Ygbm9kZSA9PSBcInN0cmluZ1wiXG4gICAgPyBpbmRleC5wcm92ZW5hbmNlLm5vZGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IG5vZGUpXG4gICAgOiBpbmRleC5yZWNvcmRGb3Iobm9kZSlcblxuICBpZiAoIXJlY29yZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgbm9kZTogJHtub2RlfWApXG5cbiAgcmV0dXJuIHJlY29yZFxufVxuXG4vKipcbiAqIEZpbmRzIG9uZSBzZW1hbnRpYyBzeW1ib2wgcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ltYm9sSWQgLSBTeW1ib2wgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2V9IFN5bWJvbCByZWNvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeW1ib2xQcm92ZW5hbmNlKG1vZHVsZSwgc3ltYm9sSWQpIHtcbiAgcmVxdWlyZVByb3ZlbmFuY2UobW9kdWxlKVxuICBjb25zdCBzeW1ib2wgPSBjcmVhdGVHZW5lcmF0aW9uSW5kZXgobW9kdWxlKS5wcm92ZW5hbmNlLnN5bWJvbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gc3ltYm9sSWQpXG5cbiAgaWYgKCFzeW1ib2wpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHNlbWFudGljIHN5bWJvbDogJHtzeW1ib2xJZH1gKVxuXG4gIHJldHVybiBzeW1ib2xcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBmcm9udGVuZCBwcm92ZW5hbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb3ZlbmFuY2V9IFByb3ZlbmFuY2UuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVQcm92ZW5hbmNlKG1vZHVsZSkge1xuICBpZiAoIW1vZHVsZS5wcm92ZW5hbmNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2VtYW50aWMgbW9kdWxlIGRvZXMgbm90IGNvbnRhaW4gc291cmNlIHByb3ZlbmFuY2UuXCIpXG5cbiAgcmV0dXJuIG1vZHVsZS5wcm92ZW5hbmNlXG59XG5cbi8qKlxuICogVHJhdmVyc2VzIHB1YmxpYyBzZW1hbnRpYyBub2RlcyBpbiBvbmUgc3RhYmxlIG9yZGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gRW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljRW50cmllcyhtb2R1bGUpIHtcbiAgLyoqIEB0eXBlIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgdmlzaXQobW9kdWxlLCBcIlwiLCBtb2R1bGUubG9jYXRpb24pXG5cbiAgcmV0dXJuIGVudHJpZXNcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBDdXJyZW50IG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ3VycmVudCBKU09OIFBvaW50ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3duZXJMb2NhdGlvbiAtIE5lYXJlc3QgbG9jYXRlZCBvd25lci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChub2RlLCBwYXRoLCBvd25lckxvY2F0aW9uKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiBvd25lckxvY2F0aW9uXG5cbiAgICBlbnRyaWVzLnB1c2goe25vZGUsIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLCBwYXRofSlcblxuICAgIGlmIChub2RlLmtpbmQgPT0gXCJNb2R1bGVcIikge1xuICAgICAgaWYgKFwiaW1wb3J0c1wiIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZS5pbXBvcnRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAvaW1wb3J0cy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIDsobm9kZS5yZWNvcmRzID8/IFtdKS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgL3JlY29yZHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICBpZiAoIShcInNvdXJjZUZpbGVuYW1lXCIgaW4gbm9kZSkgfHwgUmVmbGVjdC5nZXQobm9kZSwgXCJzdGRsaWJGYWNhZGVcIikgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA7KG5vZGUuY2xhc3NlcyA/PyBbXSkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYC9jbGFzc2VzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgOyhub2RlLmVycm9ycyA/PyBbXSkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYC9lcnJvcnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICA7KG5vZGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgL2NhcGFiaWxpdGllcy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIG5vZGUuZnVuY3Rpb25zLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAvZnVuY3Rpb25zLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgaWYgKFwiZXhwb3J0c1wiIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZS5leHBvcnRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAvZXhwb3J0cy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmVudHJ5UG9pbnQpIHZpc2l0KG5vZGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlJlY29yZERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIDsobm9kZS50eXBlUGFyYW1ldGVycyA/PyBbXSkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vdHlwZVBhcmFtZXRlcnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICBub2RlLmZpZWxkcy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9maWVsZHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25cIikge1xuICAgICAgbm9kZS5yZXNvdXJjZXMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vcmVzb3VyY2VzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgbm9kZS5mYWlsdXJlcy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9mYWlsdXJlcy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIG5vZGUub3BlcmF0aW9ucy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9vcGVyYXRpb25zLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIikge1xuICAgICAgbm9kZS5wYXJhbWV0ZXJzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQudHlwZSwgYCR7cGF0aH0vcGFyYW1ldGVycy8ke2luZGV4fS90eXBlYCwgbG9jYXRpb24pKVxuICAgICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJDbGFzc0RlY2xhcmF0aW9uXCIpIHtcbiAgICAgIG5vZGUuZmllbGRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L2ZpZWxkcy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIHZpc2l0KG5vZGUuY29uc3RydWN0b3IsIGAke3BhdGh9L2NvbnN0cnVjdG9yYCwgbG9jYXRpb24pXG4gICAgICBub2RlLm1ldGhvZHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vbWV0aG9kcy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlByaXZhdGVGaWVsZFwiKSB7XG4gICAgICB2aXNpdChub2RlLnR5cGUsIGAke3BhdGh9L3R5cGVgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIikge1xuICAgICAgbm9kZS5wYXJhbWV0ZXJzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3BhcmFtZXRlcnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIk1ldGhvZERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIG5vZGUucGFyYW1ldGVycy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlJlY29yZEZpZWxkXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudHlwZSwgYCR7cGF0aH0vdHlwZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiKSB7XG4gICAgICA7KG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW10pLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3R5cGVQYXJhbWV0ZXJzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgbm9kZS5wYXJhbWV0ZXJzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3BhcmFtZXRlcnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICB2aXNpdChub2RlLnJldHVyblR5cGUsIGAke3BhdGh9L3JldHVyblR5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuYm9keSwgYCR7cGF0aH0vYm9keWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQmxvY2tcIikge1xuICAgICAgbm9kZS5zdGF0ZW1lbnRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJQYXJhbWV0ZXJcIikge1xuICAgICAgdmlzaXQobm9kZS50eXBlLCBgJHtwYXRofS90eXBlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJWYWx1ZUJpbmRpbmdcIikge1xuICAgICAgdmlzaXQobm9kZS50eXBlLCBgJHtwYXRofS90eXBlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJDYXRjaEJpbmRpbmdcIikge1xuICAgICAgdmlzaXQobm9kZS50eXBlLCBgJHtwYXRofS90eXBlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgICB2aXNpdChub2RlLmVsZW1lbnRUeXBlLCBgJHtwYXRofS9lbGVtZW50VHlwZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiTWFwVHlwZVwiIHx8IG5vZGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUua2V5VHlwZSwgYCR7cGF0aH0va2V5VHlwZWAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS52YWx1ZVR5cGUsIGAke3BhdGh9L3ZhbHVlVHlwZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudmFsdWVUeXBlLCBgJHtwYXRofS92YWx1ZVR5cGVgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgICAgOyhub2RlLmFyZ3VtZW50cyA/PyBbXSkuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICB2aXNpdChub2RlLnR5cGUsIGAke3BhdGh9L3R5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuaW5pdGlhbGl6ZXIsIGAke3BhdGh9L2luaXRpYWxpemVyYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudGFyZ2V0LCBgJHtwYXRofS90YXJnZXRgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5yZWNlaXZlciwgYCR7cGF0aH0vcmVjZWl2ZXJgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IG5vZGUua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5jb25kaXRpb24sIGAke3BhdGh9L2NvbmRpdGlvbmAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5jb25zZXF1ZW50LCBgJHtwYXRofS9jb25zZXF1ZW50YCwgbG9jYXRpb24pXG4gICAgICBpZiAobm9kZS5hbHRlcm5hdGUpIHZpc2l0KG5vZGUuYWx0ZXJuYXRlLCBgJHtwYXRofS9hbHRlcm5hdGVgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5saXN0LCBgJHtwYXRofS9saXN0YCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLnZhbHVlQmluZGluZywgYCR7cGF0aH0vdmFsdWVCaW5kaW5nYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5tYXAsIGAke3BhdGh9L21hcGAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5rZXlCaW5kaW5nLCBgJHtwYXRofS9rZXlCaW5kaW5nYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLnZhbHVlQmluZGluZywgYCR7cGF0aH0vdmFsdWVCaW5kaW5nYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuYm9keSwgYCR7cGF0aH0vYm9keWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5lcnJvciwgYCR7cGF0aH0vZXJyb3JgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuY2F0Y2hUeXBlLCBgJHtwYXRofS9jYXRjaFR5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuY2F0Y2hCaW5kaW5nLCBgJHtwYXRofS9jYXRjaEJpbmRpbmdgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuY2F0Y2hCb2R5LCBgJHtwYXRofS9jYXRjaEJvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkVudHJ5UG9pbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5ib2R5LCBgJHtwYXRofS9ib2R5YCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdmlzaXQobm9kZS5vcGVyYW5kLCBgJHtwYXRofS9vcGVyYW5kYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUubGVmdCwgYCR7cGF0aH0vbGVmdGAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5yaWdodCwgYCR7cGF0aH0vcmlnaHRgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIgfHwgbm9kZS5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiIHx8IG5vZGUua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdChub2RlLmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUucmVjZWl2ZXIsIGAke3BhdGh9L3JlY2VpdmVyYCwgbG9jYXRpb24pXG4gICAgICBub2RlLmFyZ3VtZW50cy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgICAgdmlzaXQobm9kZS5yZWZlcmVuY2UsIGAke3BhdGh9L3JlZmVyZW5jZWAsIGxvY2F0aW9uKVxuICAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUucmVjb3JkLCBgJHtwYXRofS9yZWNvcmRgLCBsb2NhdGlvbilcbiAgICAgIG5vZGUuYXJndW1lbnRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L2FyZ3VtZW50cy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIk1lbWJlclJlYWRcIikge1xuICAgICAgdmlzaXQobm9kZS5yZWNlaXZlciwgYCR7cGF0aH0vcmVjZWl2ZXJgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikge1xuICAgICAgdmlzaXQobm9kZS5yZWNlaXZlciwgYCR7cGF0aH0vcmVjZWl2ZXJgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkVycm9yQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuZXJyb3IsIGAke3BhdGh9L2Vycm9yYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLm1lc3NhZ2UsIGAke3BhdGh9L21lc3NhZ2VgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkVycm9yTWVzc2FnZVJlYWRcIikge1xuICAgICAgdmlzaXQobm9kZS5yZWNlaXZlciwgYCR7cGF0aH0vcmVjZWl2ZXJgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkxpc3RMaXRlcmFsXCIpIHtcbiAgICAgIG5vZGUuZWxlbWVudHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vZWxlbWVudHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIgfHwgbm9kZS5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikge1xuICAgICAgbm9kZS5lbnRyaWVzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L2VudHJpZXMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJNYXBFbnRyeVwiKSB7XG4gICAgICB2aXNpdChub2RlLmtleSwgYCR7cGF0aH0va2V5YCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLnZhbHVlLCBgJHtwYXRofS92YWx1ZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiTGlzdEluZGV4RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdChub2RlLmNvbGxlY3Rpb24sIGAke3BhdGh9L2NvbGxlY3Rpb25gLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuaW5kZXgsIGAke3BhdGh9L2luZGV4YCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJNYXBMb29rdXBFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuY29sbGVjdGlvbiwgYCR7cGF0aH0vY29sbGVjdGlvbmAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5rZXksIGAke3BhdGh9L2tleWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuY29sbGVjdGlvbiwgYCR7cGF0aH0vY29sbGVjdGlvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiT3B0aW9uYWxTb21lXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudmFsdWUsIGAke3BhdGh9L3ZhbHVlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiIHx8IG5vZGUua2luZCA9PSBcIk9wdGlvbmFsVW53cmFwXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUub3BlcmFuZCwgYCR7cGF0aH0vb3BlcmFuZGAsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGRlY2xhcmF0aW9ucyBhbmQgcmVmZXJlbmNlcyBhZnRlciBzZW1hbnRpYyB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSByZWNvcmRzIC0gTm9kZSByZWNvcmRzIGJ5IG9jY3VycmVuY2UgcGF0aC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBTeW1ib2xzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHMpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSAqL1xuICBjb25zdCBzeW1ib2xzID0gW11cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCByZWNvcmRTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgZXJyb3JTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgZmllbGRTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgY2xhc3NTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgY29uc3RydWN0b3JTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgbWV0aG9kU3ltYm9scyA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgcmVzb3VyY2VTeW1ib2xzID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgb3BlcmF0aW9uU3ltYm9scyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgW2NhcGFiaWxpdHlJbmRleCwgY2FwYWJpbGl0eV0gb2YgKG1vZHVsZS5jYXBhYmlsaXRpZXMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGNhcGFiaWxpdHlQYXRoID0gYC9jYXBhYmlsaXRpZXMvJHtjYXBhYmlsaXR5SW5kZXh9YFxuXG4gICAgZGVjbGFyZShjYXBhYmlsaXR5LCBjYXBhYmlsaXR5Lm5hbWUsIFwiY2FwYWJpbGl0eVwiLCBjYXBhYmlsaXR5UGF0aClcbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZUluZGV4LCByZXNvdXJjZV0gb2YgY2FwYWJpbGl0eS5yZXNvdXJjZXMuZW50cmllcygpKSB7XG4gICAgICByZXNvdXJjZVN5bWJvbHMuc2V0KHJlc291cmNlLmlkLCBkZWNsYXJlKHJlc291cmNlLCByZXNvdXJjZS5uYW1lLCBcInJlc291cmNlXCIsIGAke2NhcGFiaWxpdHlQYXRofS9yZXNvdXJjZXMvJHtyZXNvdXJjZUluZGV4fWApKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtmYWlsdXJlSW5kZXgsIGZhaWx1cmVdIG9mIGNhcGFiaWxpdHkuZmFpbHVyZXMuZW50cmllcygpKSB7XG4gICAgICBlcnJvclN5bWJvbHMuc2V0KGZhaWx1cmUuaWQsIGRlY2xhcmUoZmFpbHVyZSwgZmFpbHVyZS5uYW1lLCBcImZhaWx1cmVcIiwgYCR7Y2FwYWJpbGl0eVBhdGh9L2ZhaWx1cmVzLyR7ZmFpbHVyZUluZGV4fWApKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtvcGVyYXRpb25JbmRleCwgb3BlcmF0aW9uXSBvZiBjYXBhYmlsaXR5Lm9wZXJhdGlvbnMuZW50cmllcygpKSB7XG4gICAgICBvcGVyYXRpb25TeW1ib2xzLnNldChvcGVyYXRpb24uaWQsIGRlY2xhcmUob3BlcmF0aW9uLCBvcGVyYXRpb24ubmFtZSwgXCJvcGVyYXRpb25cIiwgYCR7Y2FwYWJpbGl0eVBhdGh9L29wZXJhdGlvbnMvJHtvcGVyYXRpb25JbmRleH1gKSlcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBbY2FwYWJpbGl0eUluZGV4LCBjYXBhYmlsaXR5XSBvZiAobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgZm9yIChjb25zdCBbb3BlcmF0aW9uSW5kZXgsIG9wZXJhdGlvbl0gb2YgY2FwYWJpbGl0eS5vcGVyYXRpb25zLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uUGF0aCA9IGAvY2FwYWJpbGl0aWVzLyR7Y2FwYWJpbGl0eUluZGV4fS9vcGVyYXRpb25zLyR7b3BlcmF0aW9uSW5kZXh9YFxuICAgICAgb3BlcmF0aW9uLnBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyLCBwYXJhbWV0ZXJJbmRleCkgPT5cbiAgICAgICAgdmlzaXRUeXBlKHBhcmFtZXRlci50eXBlLCBgJHtvcGVyYXRpb25QYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9L3R5cGVgKSlcbiAgICAgIHZpc2l0VHlwZShvcGVyYXRpb24ucmV0dXJuVHlwZSwgYCR7b3BlcmF0aW9uUGF0aH0vcmV0dXJuVHlwZWApXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGRlY2xhcmF0aW9uXSBvZiAobW9kdWxlLnJlY29yZHMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uUGF0aCA9IGAvcmVjb3Jkcy8ke2luZGV4fWBcbiAgICBjb25zdCBzeW1ib2wgPSBkZWNsYXJlKGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5uYW1lLCBcInJlY29yZFwiLCBkZWNsYXJhdGlvblBhdGgpXG5cbiAgICBpZiAoZGVjbGFyYXRpb24uaWQpIHJlY29yZFN5bWJvbHMuc2V0KGRlY2xhcmF0aW9uLmlkLCBzeW1ib2wpXG4gICAgZm9yIChjb25zdCBbcGFyYW1ldGVySW5kZXgsIHBhcmFtZXRlcl0gb2YgKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlclN5bWJvbCA9IGRlY2xhcmUocGFyYW1ldGVyLCBwYXJhbWV0ZXIubmFtZSwgXCJ0eXBlUGFyYW1ldGVyXCIsIGAke2RlY2xhcmF0aW9uUGF0aH0vdHlwZVBhcmFtZXRlcnMvJHtwYXJhbWV0ZXJJbmRleH1gKVxuXG4gICAgICBpZiAocGFyYW1ldGVyLmlkKSB0eXBlUGFyYW1ldGVyU3ltYm9scy5zZXQocGFyYW1ldGVyLmlkLCBwYXJhbWV0ZXJTeW1ib2wpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ZpZWxkSW5kZXgsIGZpZWxkXSBvZiBkZWNsYXJhdGlvbi5maWVsZHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBmaWVsZFBhdGggPSBgJHtkZWNsYXJhdGlvblBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YFxuICAgICAgY29uc3QgZmllbGRTeW1ib2wgPSBkZWNsYXJlKGZpZWxkLCBmaWVsZC5uYW1lLCBcImZpZWxkXCIsIGZpZWxkUGF0aClcblxuICAgICAgaWYgKGZpZWxkLmlkKSBmaWVsZFN5bWJvbHMuc2V0KGZpZWxkLmlkLCBmaWVsZFN5bWJvbClcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIChtb2R1bGUuZXJyb3JzID8/IFtdKS5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBkZWNsYXJlKGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5uYW1lLCBcImVycm9yXCIsIGAvZXJyb3JzLyR7aW5kZXh9YClcblxuICAgIGlmIChkZWNsYXJhdGlvbi5pZCkgZXJyb3JTeW1ib2xzLnNldChkZWNsYXJhdGlvbi5pZCwgc3ltYm9sKVxuICB9XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGRlY2xhcmF0aW9uXSBvZiAobW9kdWxlLmNsYXNzZXMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uUGF0aCA9IGAvY2xhc3Nlcy8ke2luZGV4fWBcbiAgICBjb25zdCBjbGFzc1N5bWJvbCA9IGRlY2xhcmUoZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uLm5hbWUsIFwiY2xhc3NcIiwgZGVjbGFyYXRpb25QYXRoKVxuXG4gICAgaWYgKGRlY2xhcmF0aW9uLmlkKSBjbGFzc1N5bWJvbHMuc2V0KGRlY2xhcmF0aW9uLmlkLCBjbGFzc1N5bWJvbClcbiAgICBmb3IgKGNvbnN0IFtmaWVsZEluZGV4LCBmaWVsZF0gb2YgZGVjbGFyYXRpb24uZmllbGRzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgc3ltYm9sID0gZGVjbGFyZShmaWVsZCwgZmllbGQubmFtZSwgXCJmaWVsZFwiLCBgJHtkZWNsYXJhdGlvblBhdGh9L2ZpZWxkcy8ke2ZpZWxkSW5kZXh9YClcblxuICAgICAgaWYgKGZpZWxkLmlkKSBmaWVsZFN5bWJvbHMuc2V0KGZpZWxkLmlkLCBzeW1ib2wpXG4gICAgICB2aXNpdFR5cGUoZmllbGQudHlwZSwgYCR7ZGVjbGFyYXRpb25QYXRofS9maWVsZHMvJHtmaWVsZEluZGV4fS90eXBlYClcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JTeW1ib2wgPSBkZWNsYXJlKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLCBcImNvbnN0cnVjdG9yXCIsIFwiY29uc3RydWN0b3JcIiwgYCR7ZGVjbGFyYXRpb25QYXRofS9jb25zdHJ1Y3RvcmApXG5cbiAgICBpZiAoZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQpIGNvbnN0cnVjdG9yU3ltYm9scy5zZXQoZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQsIGNvbnN0cnVjdG9yU3ltYm9sKVxuICAgIGZvciAoY29uc3QgW21ldGhvZEluZGV4LCBtZXRob2RdIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBkZWNsYXJlKG1ldGhvZCwgbWV0aG9kLm5hbWUsIFwibWV0aG9kXCIsIGAke2RlY2xhcmF0aW9uUGF0aH0vbWV0aG9kcy8ke21ldGhvZEluZGV4fWApXG5cbiAgICAgIGlmIChtZXRob2QuaWQpIG1ldGhvZFN5bWJvbHMuc2V0KG1ldGhvZC5pZCwgc3ltYm9sKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBkZWNsYXJhdGlvbl0gb2YgKG1vZHVsZS5yZWNvcmRzID8/IFtdKS5lbnRyaWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IFtmaWVsZEluZGV4LCBmaWVsZF0gb2YgZGVjbGFyYXRpb24uZmllbGRzLmVudHJpZXMoKSkge1xuICAgICAgdmlzaXRUeXBlKGZpZWxkLnR5cGUsIGAvcmVjb3Jkcy8ke2luZGV4fS9maWVsZHMvJHtmaWVsZEluZGV4fS90eXBlYClcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25QYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG5cbiAgICBmdW5jdGlvbnMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmUoZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uLm5hbWUsIFwiZnVuY3Rpb25cIiwgZGVjbGFyYXRpb25QYXRoKSlcbiAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJJbmRleCwgcGFyYW1ldGVyXSBvZiAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyU3ltYm9sID0gZGVjbGFyZShwYXJhbWV0ZXIsIHBhcmFtZXRlci5uYW1lLCBcInR5cGVQYXJhbWV0ZXJcIiwgYCR7ZGVjbGFyYXRpb25QYXRofS90eXBlUGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWApXG5cbiAgICAgIGlmIChwYXJhbWV0ZXIuaWQpIHR5cGVQYXJhbWV0ZXJTeW1ib2xzLnNldChwYXJhbWV0ZXIuaWQsIHBhcmFtZXRlclN5bWJvbClcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25QYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBzY29wZS5zZXQocGFyYW1ldGVyLm5hbWUsIGRlY2xhcmUocGFyYW1ldGVyLCBwYXJhbWV0ZXIubmFtZSwgXCJwYXJhbWV0ZXJcIiwgYCR7ZGVjbGFyYXRpb25QYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCkpXG4gICAgICB2aXNpdFR5cGUocGFyYW1ldGVyLnR5cGUsIGAke2RlY2xhcmF0aW9uUGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fS90eXBlYClcbiAgICB9XG4gICAgdmlzaXRUeXBlKGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGAke2RlY2xhcmF0aW9uUGF0aH0vcmV0dXJuVHlwZWApXG4gICAgdmlzaXRCbG9jayhkZWNsYXJhdGlvbi5ib2R5LCBzY29wZSwgYCR7ZGVjbGFyYXRpb25QYXRofS9ib2R5YClcbiAgfVxuXG4gIGZvciAoY29uc3QgW2NsYXNzSW5kZXgsIGRlY2xhcmF0aW9uXSBvZiAobW9kdWxlLmNsYXNzZXMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uUGF0aCA9IGAvY2xhc3Nlcy8ke2NsYXNzSW5kZXh9YFxuICAgIGNvbnN0IGNvbnN0cnVjdG9yU2NvcGUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBwYXRoID0gYCR7ZGVjbGFyYXRpb25QYXRofS9jb25zdHJ1Y3Rvci9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YFxuXG4gICAgICBjb25zdHJ1Y3RvclNjb3BlLnNldChwYXJhbWV0ZXIubmFtZSwgZGVjbGFyZShwYXJhbWV0ZXIsIHBhcmFtZXRlci5uYW1lLCBcInBhcmFtZXRlclwiLCBwYXRoKSlcbiAgICAgIHZpc2l0VHlwZShwYXJhbWV0ZXIudHlwZSwgYCR7cGF0aH0vdHlwZWApXG4gICAgfVxuICAgIHZpc2l0QmxvY2soZGVjbGFyYXRpb24uY29uc3RydWN0b3IuYm9keSwgY29uc3RydWN0b3JTY29wZSwgYCR7ZGVjbGFyYXRpb25QYXRofS9jb25zdHJ1Y3Rvci9ib2R5YClcbiAgICBmb3IgKGNvbnN0IFttZXRob2RJbmRleCwgbWV0aG9kXSBvZiBkZWNsYXJhdGlvbi5tZXRob2RzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgbWV0aG9kUGF0aCA9IGAke2RlY2xhcmF0aW9uUGF0aH0vbWV0aG9kcy8ke21ldGhvZEluZGV4fWBcbiAgICAgIGNvbnN0IHNjb3BlID0gbmV3IE1hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIG1ldGhvZC5wYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYCR7bWV0aG9kUGF0aH0vcGFyYW1ldGVycy8ke3BhcmFtZXRlckluZGV4fWBcblxuICAgICAgICBzY29wZS5zZXQocGFyYW1ldGVyLm5hbWUsIGRlY2xhcmUocGFyYW1ldGVyLCBwYXJhbWV0ZXIubmFtZSwgXCJwYXJhbWV0ZXJcIiwgcGF0aCkpXG4gICAgICAgIHZpc2l0VHlwZShwYXJhbWV0ZXIudHlwZSwgYCR7cGF0aH0vdHlwZWApXG4gICAgICB9XG4gICAgICB2aXNpdFR5cGUobWV0aG9kLnJldHVyblR5cGUsIGAke21ldGhvZFBhdGh9L3JldHVyblR5cGVgKVxuICAgICAgdmlzaXRCbG9jayhtZXRob2QuYm9keSwgc2NvcGUsIGAke21ldGhvZFBhdGh9L2JvZHlgKVxuICAgIH1cbiAgfVxuXG4gIHZpc2l0QmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpLCBcIi9lbnRyeVBvaW50L2JvZHlcIilcblxuICByZXR1cm4gc3ltYm9sc1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlcyBvbmUgY2Fub25pY2FsIHN5bWJvbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRWZmZWN0RmFpbHVyZURlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZEZpZWxkIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Qcml2YXRlRmllbGQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk1ldGhvZERlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5QYXJhbWV0ZXIgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlZhbHVlQmluZGluZyB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2F0Y2hCaW5kaW5nfSBub2RlIC0gRGVjbGFyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gU3ltYm9sIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1N5bWJvbEtpbmR9IGtpbmQgLSBTeW1ib2wga2luZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBEZWNsYXJhdGlvbiBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN5bWJvbCBpZGVudGl0eS5cbiAgICovXG4gIGZ1bmN0aW9uIGRlY2xhcmUobm9kZSwgbmFtZSwga2luZCwgcGF0aCkge1xuICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHMuZ2V0KHBhdGgpXG5cbiAgICBpZiAoIXJlY29yZCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHByb3ZlbmFuY2UgZm9yICR7bm9kZS5raW5kfS5gKVxuXG4gICAgY29uc3QgbG9jYXRpb24gPSByZWNvcmQucmFuZ2VzLm5hbWUgPz8gKFwibG9jYXRpb25cIiBpbiBub2RlID8gbm9kZS5sb2NhdGlvbiA6IHByaW1hcnlMb2NhdGlvbihyZWNvcmQub3JpZ2luKSlcbiAgICBjb25zdCBpZCA9IGBzeW1ib2w6JHtzeW1ib2xzLmxlbmd0aH1gXG5cbiAgICByZWNvcmQuc3ltYm9sSWQgPSBpZFxuICAgIHN5bWJvbHMucHVzaCh7XG4gICAgICBkZWNsYXJhdGlvbk5vZGVJZDogcmVjb3JkLmlkLFxuICAgICAgaWQsXG4gICAgICBraW5kLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBuYW1lLFxuICAgICAgcmVmZXJlbmNlczogW10sXG4gICAgICAuLi4oW1wiY2FwYWJpbGl0eVwiLCBcInJlc291cmNlXCIsIFwiZmFpbHVyZVwiLCBcIm9wZXJhdGlvblwiLCBcInJlY29yZFwiLCBcImNsYXNzXCIsIFwiZXJyb3JcIiwgXCJmaWVsZFwiLCBcImNvbnN0cnVjdG9yXCIsIFwibWV0aG9kXCIsIFwiZnVuY3Rpb25cIiwgXCJ0eXBlUGFyYW1ldGVyXCJdLmluY2x1ZGVzKGtpbmQpXG4gICAgICAgID8ge3NlbWFudGljRGVjbGFyYXRpb25JZDogLyoqIEB0eXBlIHt7aWQ/OiBzdHJpbmd9fSAqLyAobm9kZSkuaWR9XG4gICAgICAgIDoge30pXG4gICAgfSlcblxuICAgIHJldHVybiBpZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHJlZmVyZW5jZXMgaW4gb25lIGxleGljYWwgYmxvY2suXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBwYXJlbnQgLSBWaXNpYmxlIGJpbmRpbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFN0YXRlbWVudCBzZXF1ZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0QmxvY2soYmxvY2ssIHBhcmVudCwgcGF0aCkge1xuICAgIGNvbnN0IHNjb3BlID0gbmV3IE1hcChwYXJlbnQpXG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RhdGVtZW50XSBvZiBibG9jay5zdGF0ZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgc3RhdGVtZW50UGF0aCA9IGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gXG5cbiAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikge1xuICAgICAgICB2aXNpdFR5cGUoc3RhdGVtZW50LnR5cGUsIGAke3N0YXRlbWVudFBhdGh9L3R5cGVgKVxuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50LmluaXRpYWxpemVyLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vaW5pdGlhbGl6ZXJgKVxuICAgICAgICBzY29wZS5zZXQoc3RhdGVtZW50Lm5hbWUsIGRlY2xhcmUoc3RhdGVtZW50LCBzdGF0ZW1lbnQubmFtZSwgXCJsb2NhbFwiLCBzdGF0ZW1lbnRQYXRoKSlcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgICAgcmVmZXJlbmNlKHN0YXRlbWVudC50YXJnZXQsIHNjb3BlLmdldChzdGF0ZW1lbnQudGFyZ2V0Lm5hbWUpLCBcIndyaXRlXCIsIGAke3N0YXRlbWVudFBhdGh9L3RhcmdldGApXG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIpIHtcbiAgICAgICAgcmVmZXJlbmNlKHN0YXRlbWVudCwgZmllbGRTeW1ib2xzLmdldChzdGF0ZW1lbnQuZmllbGQpLCBcIndyaXRlXCIsIHN0YXRlbWVudFBhdGgpXG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQucmVjZWl2ZXIsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9yZWNlaXZlcmApXG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJldHVyblN0YXRlbWVudFwiKSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbikgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmApXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9leHByZXNzaW9uYClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vY29uZGl0aW9uYClcbiAgICAgICAgdmlzaXRCbG9jayhzdGF0ZW1lbnQuY29uc2VxdWVudCwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2NvbnNlcXVlbnRgKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmlzaXRCbG9jayhzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vYWx0ZXJuYXRlYClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5saXN0LCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vbGlzdGApXG4gICAgICAgIGNvbnN0IGJvZHlTY29wZSA9IG5ldyBNYXAoc2NvcGUpXG5cbiAgICAgICAgdmlzaXRUeXBlKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgYCR7c3RhdGVtZW50UGF0aH0vdmFsdWVCaW5kaW5nL3R5cGVgKVxuXG4gICAgICAgIGJvZHlTY29wZS5zZXQoc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLCBkZWNsYXJlKFxuICAgICAgICAgIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcsXG4gICAgICAgICAgc3RhdGVtZW50LnZhbHVlQmluZGluZy5uYW1lLFxuICAgICAgICAgIFwiaXRlcmF0aW9uXCIsXG4gICAgICAgICAgYCR7c3RhdGVtZW50UGF0aH0vdmFsdWVCaW5kaW5nYFxuICAgICAgICApKVxuICAgICAgICB2aXNpdEJsb2NrKHN0YXRlbWVudC5ib2R5LCBib2R5U2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2JvZHlgKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50Lm1hcCwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L21hcGApXG4gICAgICAgIGNvbnN0IGJvZHlTY29wZSA9IG5ldyBNYXAoc2NvcGUpXG5cbiAgICAgICAgdmlzaXRUeXBlKHN0YXRlbWVudC5rZXlCaW5kaW5nLnR5cGUsIGAke3N0YXRlbWVudFBhdGh9L2tleUJpbmRpbmcvdHlwZWApXG4gICAgICAgIHZpc2l0VHlwZShzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLnR5cGUsIGAke3N0YXRlbWVudFBhdGh9L3ZhbHVlQmluZGluZy90eXBlYClcbiAgICAgICAgYm9keVNjb3BlLnNldChzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lLCBkZWNsYXJlKFxuICAgICAgICAgIHN0YXRlbWVudC5rZXlCaW5kaW5nLCBzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lLCBcIml0ZXJhdGlvblwiLCBgJHtzdGF0ZW1lbnRQYXRofS9rZXlCaW5kaW5nYFxuICAgICAgICApKVxuICAgICAgICBib2R5U2NvcGUuc2V0KHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwgZGVjbGFyZShcbiAgICAgICAgICBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIFwiaXRlcmF0aW9uXCIsIGAke3N0YXRlbWVudFBhdGh9L3ZhbHVlQmluZGluZ2BcbiAgICAgICAgKSlcbiAgICAgICAgdmlzaXRCbG9jayhzdGF0ZW1lbnQuYm9keSwgYm9keVNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9ib2R5YClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vY29uZGl0aW9uYClcbiAgICAgICAgdmlzaXRCbG9jayhzdGF0ZW1lbnQuYm9keSwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2JvZHlgKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlJhaXNlU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXRUeXBlKHN0YXRlbWVudC5lcnJvci5lcnJvciwgYCR7c3RhdGVtZW50UGF0aH0vZXJyb3IvZXJyb3JgKVxuICAgICAgICByZWZlcmVuY2Uoc3RhdGVtZW50LmVycm9yLCBlcnJvclN5bWJvbHMuZ2V0KHN0YXRlbWVudC5lcnJvci5lcnJvci5kZWNsYXJhdGlvbklkKSwgXCJjb25zdHJ1Y3RcIiwgYCR7c3RhdGVtZW50UGF0aH0vZXJyb3JgKVxuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9lcnJvci9tZXNzYWdlYClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdEJsb2NrKHN0YXRlbWVudC5ib2R5LCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vYm9keWApXG4gICAgICAgIHZpc2l0VHlwZShzdGF0ZW1lbnQuY2F0Y2hUeXBlLCBgJHtzdGF0ZW1lbnRQYXRofS9jYXRjaFR5cGVgKVxuICAgICAgICB2aXNpdFR5cGUoc3RhdGVtZW50LmNhdGNoQmluZGluZy50eXBlLCBgJHtzdGF0ZW1lbnRQYXRofS9jYXRjaEJpbmRpbmcvdHlwZWApXG4gICAgICAgIGNvbnN0IGNhdGNoU2NvcGUgPSBuZXcgTWFwKHNjb3BlKVxuXG4gICAgICAgIGNhdGNoU2NvcGUuc2V0KHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubmFtZSwgZGVjbGFyZShcbiAgICAgICAgICBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLFxuICAgICAgICAgIHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubmFtZSxcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgYCR7c3RhdGVtZW50UGF0aH0vY2F0Y2hCaW5kaW5nYFxuICAgICAgICApKVxuICAgICAgICB2aXNpdEJsb2NrKHN0YXRlbWVudC5jYXRjaEJvZHksIGNhdGNoU2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2NhdGNoQm9keWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHJlZmVyZW5jZXMgaW4gb25lIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBzY29wZSAtIFZpc2libGUgYmluZGluZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhwcmVzc2lvbiBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNjb3BlLCBwYXRoKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJlZmVyZW5jZShleHByZXNzaW9uLCBzY29wZS5nZXQoZXhwcmVzc2lvbi5uYW1lKSwgXCJyZWFkXCIsIHBhdGgpXG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpIHJlZmVyZW5jZShleHByZXNzaW9uLCBjbGFzc1N5bWJvbHMuZ2V0KGV4cHJlc3Npb24uY2xhc3NJZCksIFwicmVhZFwiLCBwYXRoKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gbW9kdWxlLmZ1bmN0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLnJlc29sdXRpb24/LmRlY2xhcmF0aW9uSWQpXG5cbiAgICAgIHJlZmVyZW5jZShleHByZXNzaW9uLCBkZWNsYXJhdGlvbiA/IGZ1bmN0aW9ucy5nZXQoZGVjbGFyYXRpb24ubmFtZSkgOiB1bmRlZmluZWQsIFwiY2FsbFwiLCBwYXRoKVxuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ3VtZW50XSBvZiBleHByZXNzaW9uLmFyZ3VtZW50cy5lbnRyaWVzKCkpIHZpc2l0RXhwcmVzc2lvbihhcmd1bWVudCwgc2NvcGUsIGAke3BhdGh9L2FyZ3VtZW50cy8ke2luZGV4fWApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICByZWZlcmVuY2UoZXhwcmVzc2lvbiwgb3BlcmF0aW9uU3ltYm9scy5nZXQoZXhwcmVzc2lvbi5vcGVyYXRpb24pLCBcImNhbGxcIiwgcGF0aClcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQsIHNjb3BlLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiIHx8IGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5leHByZXNzaW9uLCBzY29wZSwgYCR7cGF0aH0vZXhwcmVzc2lvbmApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNvcmRDb25zdHJ1Y3Rpb25cIikge1xuICAgICAgcmVmZXJlbmNlKGV4cHJlc3Npb24sIHJlY29yZFN5bWJvbHMuZ2V0KGV4cHJlc3Npb24ucmVjb3JkLmRlY2xhcmF0aW9uSWQpLCBcImNvbnN0cnVjdFwiLCBwYXRoKVxuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ3VtZW50XSBvZiBleHByZXNzaW9uLmFyZ3VtZW50cy5lbnRyaWVzKCkpIHZpc2l0RXhwcmVzc2lvbihhcmd1bWVudCwgc2NvcGUsIGAke3BhdGh9L2FyZ3VtZW50cy8ke2luZGV4fWApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgICAgcmVmZXJlbmNlKGV4cHJlc3Npb24sIGNvbnN0cnVjdG9yU3ltYm9scy5nZXQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChleHByZXNzaW9uLnJlc29sdXRpb24/LmRlY2xhcmF0aW9uSWQpKSwgXCJjb25zdHJ1Y3RcIiwgcGF0aClcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQsIHNjb3BlLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgcmVmZXJlbmNlKGV4cHJlc3Npb24sIG1ldGhvZFN5bWJvbHMuZ2V0KGV4cHJlc3Npb24ubWV0aG9kKSwgXCJjYWxsXCIsIHBhdGgpXG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5yZWNlaXZlciwgc2NvcGUsIGAke3BhdGh9L3JlY2VpdmVyYClcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQsIHNjb3BlLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWVtYmVyUmVhZFwiKSB7XG4gICAgICByZWZlcmVuY2UoZXhwcmVzc2lvbiwgZmllbGRTeW1ib2xzLmdldChleHByZXNzaW9uLmZpZWxkKSwgXCJtZW1iZXJcIiwgcGF0aClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnJlY2VpdmVyLCBzY29wZSwgYCR7cGF0aH0vcmVjZWl2ZXJgKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSB7XG4gICAgICByZWZlcmVuY2UoZXhwcmVzc2lvbiwgZmllbGRTeW1ib2xzLmdldChleHByZXNzaW9uLmZpZWxkKSwgXCJtZW1iZXJcIiwgcGF0aClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnJlY2VpdmVyLCBzY29wZSwgYCR7cGF0aH0vcmVjZWl2ZXJgKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRXJyb3JNZXNzYWdlUmVhZFwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5yZWNlaXZlciwgc2NvcGUsIGAke3BhdGh9L3JlY2VpdmVyYClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5vcGVyYW5kLCBzY29wZSwgYCR7cGF0aH0vb3BlcmFuZGApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmxlZnQsIHNjb3BlLCBgJHtwYXRofS9sZWZ0YClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnJpZ2h0LCBzY29wZSwgYCR7cGF0aH0vcmlnaHRgKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdExpdGVyYWxcIikge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGVsZW1lbnRdIG9mIGV4cHJlc3Npb24uZWxlbWVudHMuZW50cmllcygpKSB2aXNpdEV4cHJlc3Npb24oZWxlbWVudCwgc2NvcGUsIGAke3BhdGh9L2VsZW1lbnRzLyR7aW5kZXh9YClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExpdGVyYWxcIiB8fCBleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGV4cHJlc3Npb24uZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKGVudHJ5LmtleSwgc2NvcGUsIGAke3BhdGh9L2VudHJpZXMvJHtpbmRleH0va2V5YClcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKGVudHJ5LnZhbHVlLCBzY29wZSwgYCR7cGF0aH0vZW50cmllcy8ke2luZGV4fS92YWx1ZWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBgJHtwYXRofS9jb2xsZWN0aW9uYClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmluZGV4LCBzY29wZSwgYCR7cGF0aH0vaW5kZXhgKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSwgYCR7cGF0aH0vY29sbGVjdGlvbmApXG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5rZXksIHNjb3BlLCBgJHtwYXRofS9rZXlgKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBgJHtwYXRofS9jb2xsZWN0aW9uYClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsU29tZVwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi52YWx1ZSwgc2NvcGUsIGAke3BhdGh9L3ZhbHVlYClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsSXNQcmVzZW50XCIgfHwgZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxVbndyYXBcIikge1xuICAgICAgdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ub3BlcmFuZCwgc2NvcGUsIGAke3BhdGh9L29wZXJhbmRgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBub21pbmFsIHJlZmVyZW5jZXMgbmVzdGVkIGluIGEgc2VtYW50aWMgdHlwZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvclR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFR5cGUgb2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0VHlwZSh0eXBlLCBwYXRoKSB7XG4gICAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZWZlcmVuY2UodHlwZSwgdHlwZVBhcmFtZXRlclN5bWJvbHMuZ2V0KHR5cGUucGFyYW1ldGVySWQpLCBcInR5cGVcIiwgcGF0aClcbiAgICBlbHNlIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICAgIHJlZmVyZW5jZSh0eXBlLCByZWNvcmRTeW1ib2xzLmdldCh0eXBlLmRlY2xhcmF0aW9uSWQpLCBcInR5cGVcIiwgcGF0aClcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgKHR5cGUuYXJndW1lbnRzID8/IFtdKS5lbnRyaWVzKCkpIHZpc2l0VHlwZShhcmd1bWVudCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YClcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHJlZmVyZW5jZSh0eXBlLCBlcnJvclN5bWJvbHMuZ2V0KHR5cGUuZGVjbGFyYXRpb25JZCksIFwidHlwZVwiLCBwYXRoKVxuICAgIGVsc2UgaWYgKHR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmVmZXJlbmNlKHR5cGUsIGNsYXNzU3ltYm9scy5nZXQodHlwZS5kZWNsYXJhdGlvbklkKSwgXCJ0eXBlXCIsIHBhdGgpXG4gICAgZWxzZSBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmVmZXJlbmNlKHR5cGUsIHJlc291cmNlU3ltYm9scy5nZXQodHlwZS5yZXNvdXJjZUlkKSwgXCJ0eXBlXCIsIHBhdGgpXG4gICAgZWxzZSBpZiAodHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgdmlzaXRUeXBlKHR5cGUuZWxlbWVudFR5cGUsIGAke3BhdGh9L2VsZW1lbnRUeXBlYClcbiAgICBlbHNlIGlmICh0eXBlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgdHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgdmlzaXRUeXBlKHR5cGUua2V5VHlwZSwgYCR7cGF0aH0va2V5VHlwZWApXG4gICAgICB2aXNpdFR5cGUodHlwZS52YWx1ZVR5cGUsIGAke3BhdGh9L3ZhbHVlVHlwZWApXG4gICAgfSBlbHNlIGlmICh0eXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgdmlzaXRUeXBlKHR5cGUudmFsdWVUeXBlLCBgJHtwYXRofS92YWx1ZVR5cGVgKVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIG9uZSByZXNvbHZlZCBzeW1ib2wgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuSWRlbnRpZmllckV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY2VpdmVyRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVmZmVjdENhbGxFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NZXRob2RDYWxsRXhwcmVzc2lvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmRUeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWZlcmVuY2VUeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Pd25lZFJlZmVyZW5jZVR5cGUgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmRDb25zdHJ1Y3Rpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuTWVtYmVyUmVhZCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkUmVhZCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZSB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JDb25zdHJ1Y3Rpb259IG5vZGUgLSBSZWZlcmVuY2Ugbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHN5bWJvbElkIC0gUmVzb2x2ZWQgc3ltYm9sLlxuICAgKiBAcGFyYW0ge1widHlwZVwiIHwgXCJjb25zdHJ1Y3RcIiB8IFwibWVtYmVyXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUmVmZXJlbmNlIG9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZWZlcmVuY2Uobm9kZSwgc3ltYm9sSWQsIHJvbGUsIHBhdGgpIHtcbiAgICBpZiAoIXN5bWJvbElkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHMuZ2V0KHBhdGgpXG4gICAgY29uc3Qgc3ltYm9sID0gc3ltYm9scy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzeW1ib2xJZClcblxuICAgIGlmICghcmVjb3JkIHx8ICFzeW1ib2wpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwcm92ZW5hbmNlIHdoaWxlIHJlc29sdmluZyAke25vZGUua2luZH0uYClcblxuICAgIGNvbnN0IHJhbmdlUm9sZSA9IHJvbGUgPT0gXCJjYWxsXCIgPyAobm9kZS5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiA/IFwibWVtYmVyXCIgOiBcImNhbGxlZVwiKSA6XG4gICAgICByb2xlID09IFwiY29uc3RydWN0XCIgPyAobm9kZS5raW5kID09IFwiRXJyb3JDb25zdHJ1Y3Rpb25cIiA/IFwidHlwZVwiIDogbm9kZS5raW5kID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIgPyBcImNsYXNzXCIgOiBcInJlY29yZFwiKSA6XG4gICAgICAgIHJvbGUgPT0gXCJtZW1iZXJcIiB8fCByb2xlID09IFwid3JpdGVcIiAmJiBub2RlLmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiID8gXCJtZW1iZXJcIiA6IHJvbGUgPT0gXCJ0eXBlXCIgPyBcInR5cGVcIiA6IFwibmFtZVwiXG4gICAgY29uc3QgbG9jYXRpb24gPSByZWNvcmQucmFuZ2VzW3JhbmdlUm9sZV0gPz8gKFwibG9jYXRpb25cIiBpbiBub2RlID8gbm9kZS5sb2NhdGlvbiA6IHByaW1hcnlMb2NhdGlvbihyZWNvcmQub3JpZ2luKSlcblxuICAgIHJlY29yZC5zeW1ib2xJZCA9IHN5bWJvbElkXG4gICAgc3ltYm9sLnJlZmVyZW5jZXMucHVzaCh7bG9jYXRpb24sIG5vZGVJZDogcmVjb3JkLmlkLCByb2xlfSlcbiAgfVxufVxuIl19