@wbce/projen-d9 0.0.28 → 0.1.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 (421) hide show
  1. package/.jsii +184 -45
  2. package/API.md +153 -37
  3. package/CHANGELOG.md +13 -0
  4. package/README.md +10 -3
  5. package/docs/D9-plumbing.md +189 -0
  6. package/lib/cli/atlas.d.ts +10 -0
  7. package/lib/cli/atlas.js +65 -0
  8. package/lib/cli/commands/cedar/cedar-format.d.ts +7 -0
  9. package/lib/cli/commands/cedar/cedar-format.js +75 -0
  10. package/lib/cli/commands/cedar/cedar-to-d9-translations.d.ts +12 -0
  11. package/lib/cli/commands/cedar/cedar-to-d9-translations.js +130 -0
  12. package/lib/cli/commands/cedar/cedar-to-d9.d.ts +57 -0
  13. package/lib/cli/commands/cedar/cedar-to-d9.js +221 -0
  14. package/lib/cli/commands/cedar/cedar-translations.d.ts +9 -0
  15. package/lib/cli/commands/cedar/cedar-translations.js +213 -0
  16. package/lib/cli/commands/cedar/d9-permission.d.ts +27 -0
  17. package/lib/cli/commands/cedar/d9-permission.js +45 -0
  18. package/lib/cli/commands/cedar/d9-to-cedar.d.ts +33 -0
  19. package/lib/cli/commands/cedar/d9-to-cedar.js +157 -0
  20. package/lib/cli/commands/cedar/roles-table.d.ts +14 -0
  21. package/lib/cli/commands/cedar/roles-table.js +29 -0
  22. package/lib/cli/commands/save/apply-snapshot.js +39 -30
  23. package/lib/cli/commands/save/check-unsaved.d.ts +9 -0
  24. package/lib/cli/commands/save/check-unsaved.js +81 -0
  25. package/lib/cli/commands/save/env.d.ts +33 -0
  26. package/lib/cli/commands/save/env.js +109 -0
  27. package/lib/cli/commands/save/save-snapshot.d.ts +9 -0
  28. package/lib/cli/commands/save/save-snapshot.js +232 -0
  29. package/lib/cli/commands/save/sync-files.d.ts +5 -0
  30. package/lib/cli/commands/save/sync-files.js +46 -0
  31. package/lib/cli/commands/save/transfer.d.ts +18 -0
  32. package/lib/cli/commands/save/transfer.js +96 -0
  33. package/lib/cli/commands/save/utils.d.ts +5 -0
  34. package/lib/cli/commands/save/utils.js +33 -3
  35. package/lib/cli/commands/sync.js +4 -3
  36. package/lib/cli/index.js +65 -25
  37. package/lib/cli/logger.d.ts +2 -0
  38. package/lib/cli/logger.js +10 -0
  39. package/lib/cli/plumbing-config.d.ts +11 -0
  40. package/lib/cli/plumbing-config.js +13 -0
  41. package/lib/index.d.ts +44 -5
  42. package/lib/index.js +54 -41
  43. package/node_modules/@cedar-policy/cedar-wasm/README.md +181 -0
  44. package/node_modules/@cedar-policy/cedar-wasm/esm/README.md +181 -0
  45. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.d.ts +427 -0
  46. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm.js +9 -0
  47. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.js +434 -0
  48. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm +0 -0
  49. package/node_modules/@cedar-policy/cedar-wasm/esm/cedar_wasm_bg.wasm.d.ts +34 -0
  50. package/node_modules/@cedar-policy/cedar-wasm/esm/package.json +23 -0
  51. package/node_modules/@cedar-policy/cedar-wasm/nodejs/README.md +181 -0
  52. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.d.ts +427 -0
  53. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm.js +463 -0
  54. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm +0 -0
  55. package/node_modules/@cedar-policy/cedar-wasm/nodejs/cedar_wasm_bg.wasm.d.ts +34 -0
  56. package/node_modules/@cedar-policy/cedar-wasm/nodejs/package.json +18 -0
  57. package/node_modules/@cedar-policy/cedar-wasm/package.json +53 -0
  58. package/node_modules/@cedar-policy/cedar-wasm/web/README.md +181 -0
  59. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.d.ts +486 -0
  60. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm.js +534 -0
  61. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm +0 -0
  62. package/node_modules/@cedar-policy/cedar-wasm/web/cedar_wasm_bg.wasm.d.ts +34 -0
  63. package/node_modules/@cedar-policy/cedar-wasm/web/package.json +21 -0
  64. package/node_modules/@types/node/README.md +5 -6
  65. package/node_modules/@types/node/assert/strict.d.ts +111 -0
  66. package/node_modules/@types/node/assert.d.ts +1040 -79
  67. package/node_modules/@types/node/async_hooks.d.ts +476 -119
  68. package/node_modules/@types/node/buffer.buffer.d.ts +472 -0
  69. package/node_modules/@types/node/buffer.d.ts +1925 -13
  70. package/node_modules/@types/node/child_process.d.ts +1204 -235
  71. package/node_modules/@types/node/cluster.d.ts +455 -137
  72. package/node_modules/@types/node/compatibility/disposable.d.ts +14 -0
  73. package/node_modules/@types/node/compatibility/index.d.ts +9 -0
  74. package/node_modules/@types/node/compatibility/indexable.d.ts +20 -0
  75. package/node_modules/@types/node/compatibility/iterators.d.ts +20 -0
  76. package/node_modules/@types/node/console.d.ts +450 -1
  77. package/node_modules/@types/node/constants.d.ts +20 -447
  78. package/node_modules/@types/node/crypto.d.ts +3962 -600
  79. package/node_modules/@types/node/dgram.d.ts +515 -33
  80. package/node_modules/@types/node/diagnostics_channel.d.ts +578 -0
  81. package/node_modules/@types/node/dns/promises.d.ts +503 -0
  82. package/node_modules/@types/node/dns.d.ts +798 -247
  83. package/node_modules/@types/node/domain.d.ts +164 -10
  84. package/node_modules/@types/node/events.d.ts +954 -25
  85. package/node_modules/@types/node/fs/promises.d.ts +1295 -0
  86. package/node_modules/@types/node/fs.d.ts +3463 -1569
  87. package/node_modules/@types/node/globals.d.ts +98 -1277
  88. package/node_modules/@types/node/globals.typedarray.d.ts +38 -0
  89. package/node_modules/@types/node/http.d.ts +1933 -300
  90. package/node_modules/@types/node/http2.d.ts +1946 -254
  91. package/node_modules/@types/node/https.d.ts +557 -134
  92. package/node_modules/@types/node/index.d.ts +54 -48
  93. package/node_modules/@types/node/inspector.d.ts +227 -3014
  94. package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
  95. package/node_modules/@types/node/module.d.ts +890 -2
  96. package/node_modules/@types/node/net.d.ts +872 -105
  97. package/node_modules/@types/node/os.d.ts +452 -209
  98. package/node_modules/@types/node/package.json +78 -128
  99. package/node_modules/@types/node/path.d.ts +196 -155
  100. package/node_modules/@types/node/perf_hooks.d.ts +829 -120
  101. package/node_modules/@types/node/process.d.ts +2072 -3
  102. package/node_modules/@types/node/punycode.d.ts +69 -27
  103. package/node_modules/@types/node/querystring.d.ts +132 -9
  104. package/node_modules/@types/node/readline/promises.d.ts +161 -0
  105. package/node_modules/@types/node/readline.d.ts +485 -49
  106. package/node_modules/@types/node/repl.d.ts +121 -83
  107. package/node_modules/@types/node/sea.d.ts +153 -0
  108. package/node_modules/@types/node/sqlite.d.ts +721 -0
  109. package/node_modules/@types/node/stream/consumers.d.ts +38 -0
  110. package/node_modules/@types/node/stream/promises.d.ts +90 -0
  111. package/node_modules/@types/node/stream/web.d.ts +622 -0
  112. package/node_modules/@types/node/stream.d.ts +1470 -140
  113. package/node_modules/@types/node/string_decoder.d.ts +64 -4
  114. package/node_modules/@types/node/test.d.ts +2163 -0
  115. package/node_modules/@types/node/timers/promises.d.ts +108 -0
  116. package/node_modules/@types/node/timers.d.ts +284 -13
  117. package/node_modules/@types/node/tls.d.ts +850 -244
  118. package/node_modules/@types/node/trace_events.d.ts +147 -11
  119. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +468 -0
  120. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +34 -0
  121. package/node_modules/@types/node/ts5.6/index.d.ts +97 -0
  122. package/node_modules/@types/node/tty.d.ts +160 -18
  123. package/node_modules/@types/node/url.d.ts +890 -53
  124. package/node_modules/@types/node/util.d.ts +2566 -160
  125. package/node_modules/@types/node/v8.d.ts +806 -83
  126. package/node_modules/@types/node/vm.d.ts +932 -44
  127. package/node_modules/@types/node/wasi.d.ts +148 -22
  128. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
  129. package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
  130. package/node_modules/@types/node/web-globals/events.d.ts +97 -0
  131. package/node_modules/@types/node/web-globals/fetch.d.ts +55 -0
  132. package/node_modules/@types/node/web-globals/navigator.d.ts +22 -0
  133. package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
  134. package/node_modules/@types/node/worker_threads.d.ts +657 -80
  135. package/node_modules/@types/node/zlib.d.ts +510 -119
  136. package/node_modules/pino/.nojekyll +0 -0
  137. package/node_modules/pino/.prettierignore +1 -0
  138. package/node_modules/pino/CNAME +1 -0
  139. package/node_modules/pino/CONTRIBUTING.md +34 -0
  140. package/node_modules/pino/LICENSE +21 -0
  141. package/node_modules/pino/README.md +177 -0
  142. package/node_modules/pino/SECURITY.md +103 -0
  143. package/node_modules/pino/benchmarks/basic.bench.js +95 -0
  144. package/node_modules/pino/benchmarks/child-child.bench.js +52 -0
  145. package/node_modules/pino/benchmarks/child-creation.bench.js +73 -0
  146. package/node_modules/pino/benchmarks/child.bench.js +62 -0
  147. package/node_modules/pino/benchmarks/deep-object.bench.js +88 -0
  148. package/node_modules/pino/benchmarks/formatters.bench.js +50 -0
  149. package/node_modules/pino/benchmarks/internal/custom-levels.js +67 -0
  150. package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  151. package/node_modules/pino/benchmarks/internal/just-pino.bench.js +182 -0
  152. package/node_modules/pino/benchmarks/internal/parent-vs-child.bench.js +75 -0
  153. package/node_modules/pino/benchmarks/internal/redact.bench.js +86 -0
  154. package/node_modules/pino/benchmarks/long-string.bench.js +81 -0
  155. package/node_modules/pino/benchmarks/multi-arg.bench.js +193 -0
  156. package/node_modules/pino/benchmarks/multistream.js +98 -0
  157. package/node_modules/pino/benchmarks/object.bench.js +82 -0
  158. package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +36 -0
  159. package/node_modules/pino/benchmarks/utils/runbench.js +138 -0
  160. package/node_modules/pino/benchmarks/utils/wrap-log-level.js +55 -0
  161. package/node_modules/pino/bin.js +6 -0
  162. package/node_modules/pino/browser.js +607 -0
  163. package/node_modules/pino/build/sync-version.js +25 -0
  164. package/node_modules/pino/docs/api.md +1664 -0
  165. package/node_modules/pino/docs/asynchronous.md +55 -0
  166. package/node_modules/pino/docs/benchmarks.md +55 -0
  167. package/node_modules/pino/docs/browser.md +341 -0
  168. package/node_modules/pino/docs/bundling.md +40 -0
  169. package/node_modules/pino/docs/child-loggers.md +116 -0
  170. package/node_modules/pino/docs/diagnostics.md +16 -0
  171. package/node_modules/pino/docs/ecosystem.md +87 -0
  172. package/node_modules/pino/docs/help.md +353 -0
  173. package/node_modules/pino/docs/lts.md +93 -0
  174. package/node_modules/pino/docs/pretty.md +38 -0
  175. package/node_modules/pino/docs/redaction.md +130 -0
  176. package/node_modules/pino/docs/transports.md +1447 -0
  177. package/node_modules/pino/docs/web.md +306 -0
  178. package/node_modules/pino/eslint.config.js +36 -0
  179. package/node_modules/pino/examples/basic.js +43 -0
  180. package/node_modules/pino/examples/transport.js +68 -0
  181. package/node_modules/pino/favicon.ico +0 -0
  182. package/node_modules/pino/file.js +12 -0
  183. package/node_modules/pino/inc-version.sh +42 -0
  184. package/node_modules/pino/index.html +55 -0
  185. package/node_modules/pino/lib/caller.js +40 -0
  186. package/node_modules/pino/lib/constants.js +28 -0
  187. package/node_modules/pino/lib/deprecations.js +8 -0
  188. package/node_modules/pino/lib/levels.js +241 -0
  189. package/node_modules/pino/lib/meta.js +3 -0
  190. package/node_modules/pino/lib/multistream.js +211 -0
  191. package/node_modules/pino/lib/proto.js +256 -0
  192. package/node_modules/pino/lib/redaction.js +119 -0
  193. package/node_modules/pino/lib/symbols.js +76 -0
  194. package/node_modules/pino/lib/time.js +39 -0
  195. package/node_modules/pino/lib/tools.js +427 -0
  196. package/node_modules/pino/lib/transport-stream.js +56 -0
  197. package/node_modules/pino/lib/transport.js +302 -0
  198. package/node_modules/pino/lib/worker.js +197 -0
  199. package/node_modules/pino/package.json +112 -0
  200. package/node_modules/pino/pino.d.ts +881 -0
  201. package/node_modules/pino/pino.js +259 -0
  202. package/node_modules/pino/test/basic.test.js +952 -0
  203. package/node_modules/pino/test/broken-pipe.test.js +59 -0
  204. package/node_modules/pino/test/browser-bindings.test.js +114 -0
  205. package/node_modules/pino/test/browser-child.test.js +132 -0
  206. package/node_modules/pino/test/browser-disabled.test.js +87 -0
  207. package/node_modules/pino/test/browser-early-console-freeze.test.js +12 -0
  208. package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
  209. package/node_modules/pino/test/browser-levels.test.js +241 -0
  210. package/node_modules/pino/test/browser-redaction.test.js +264 -0
  211. package/node_modules/pino/test/browser-serializers.test.js +352 -0
  212. package/node_modules/pino/test/browser-set-bindings.test.js +99 -0
  213. package/node_modules/pino/test/browser-timestamp.test.js +88 -0
  214. package/node_modules/pino/test/browser-transmit.test.js +417 -0
  215. package/node_modules/pino/test/browser.test.js +698 -0
  216. package/node_modules/pino/test/caller.test.js +20 -0
  217. package/node_modules/pino/test/complex-objects.test.js +36 -0
  218. package/node_modules/pino/test/crlf.test.js +34 -0
  219. package/node_modules/pino/test/custom-levels.test.js +267 -0
  220. package/node_modules/pino/test/diagnostics.test.js +107 -0
  221. package/node_modules/pino/test/error-key.test.js +37 -0
  222. package/node_modules/pino/test/error.test.js +403 -0
  223. package/node_modules/pino/test/escaping.test.js +110 -0
  224. package/node_modules/pino/test/esm/esm.mjs +14 -0
  225. package/node_modules/pino/test/esm/index.test.js +21 -0
  226. package/node_modules/pino/test/esm/named-exports.mjs +29 -0
  227. package/node_modules/pino/test/exit.test.js +79 -0
  228. package/node_modules/pino/test/fixtures/broken-pipe/basic.js +9 -0
  229. package/node_modules/pino/test/fixtures/broken-pipe/destination.js +10 -0
  230. package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +12 -0
  231. package/node_modules/pino/test/fixtures/caller-loop.js +6 -0
  232. package/node_modules/pino/test/fixtures/console-transport.js +13 -0
  233. package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
  234. package/node_modules/pino/test/fixtures/default-exit.js +8 -0
  235. package/node_modules/pino/test/fixtures/destination-exit.js +8 -0
  236. package/node_modules/pino/test/fixtures/eval/index.js +13 -0
  237. package/node_modules/pino/test/fixtures/eval/node_modules/14-files.js +3 -0
  238. package/node_modules/pino/test/fixtures/eval/node_modules/2-files.js +3 -0
  239. package/node_modules/pino/test/fixtures/eval/node_modules/file1.js +5 -0
  240. package/node_modules/pino/test/fixtures/eval/node_modules/file10.js +5 -0
  241. package/node_modules/pino/test/fixtures/eval/node_modules/file11.js +5 -0
  242. package/node_modules/pino/test/fixtures/eval/node_modules/file12.js +5 -0
  243. package/node_modules/pino/test/fixtures/eval/node_modules/file13.js +5 -0
  244. package/node_modules/pino/test/fixtures/eval/node_modules/file14.js +11 -0
  245. package/node_modules/pino/test/fixtures/eval/node_modules/file2.js +5 -0
  246. package/node_modules/pino/test/fixtures/eval/node_modules/file3.js +5 -0
  247. package/node_modules/pino/test/fixtures/eval/node_modules/file4.js +5 -0
  248. package/node_modules/pino/test/fixtures/eval/node_modules/file5.js +5 -0
  249. package/node_modules/pino/test/fixtures/eval/node_modules/file6.js +5 -0
  250. package/node_modules/pino/test/fixtures/eval/node_modules/file7.js +5 -0
  251. package/node_modules/pino/test/fixtures/eval/node_modules/file8.js +5 -0
  252. package/node_modules/pino/test/fixtures/eval/node_modules/file9.js +5 -0
  253. package/node_modules/pino/test/fixtures/noop-transport.js +10 -0
  254. package/node_modules/pino/test/fixtures/pretty/null-prototype.js +8 -0
  255. package/node_modules/pino/test/fixtures/stdout-hack-protection.js +11 -0
  256. package/node_modules/pino/test/fixtures/syncfalse-child.js +6 -0
  257. package/node_modules/pino/test/fixtures/syncfalse-exit.js +9 -0
  258. package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +10 -0
  259. package/node_modules/pino/test/fixtures/syncfalse.js +6 -0
  260. package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
  261. package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +20 -0
  262. package/node_modules/pino/test/fixtures/to-file-transport.js +13 -0
  263. package/node_modules/pino/test/fixtures/to-file-transport.mjs +8 -0
  264. package/node_modules/pino/test/fixtures/transport/index.js +12 -0
  265. package/node_modules/pino/test/fixtures/transport/package.json +5 -0
  266. package/node_modules/pino/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  267. package/node_modules/pino/test/fixtures/transport-exit-immediately.js +11 -0
  268. package/node_modules/pino/test/fixtures/transport-exit-on-ready.js +12 -0
  269. package/node_modules/pino/test/fixtures/transport-invalid-node-options.js +26 -0
  270. package/node_modules/pino/test/fixtures/transport-main.js +9 -0
  271. package/node_modules/pino/test/fixtures/transport-many-lines.js +29 -0
  272. package/node_modules/pino/test/fixtures/transport-preload-main.mjs +13 -0
  273. package/node_modules/pino/test/fixtures/transport-preload.mjs +13 -0
  274. package/node_modules/pino/test/fixtures/transport-string-stdout.js +9 -0
  275. package/node_modules/pino/test/fixtures/transport-transform.js +21 -0
  276. package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +33 -0
  277. package/node_modules/pino/test/fixtures/transport-with-on-exit.js +12 -0
  278. package/node_modules/pino/test/fixtures/transport-worker-data.js +19 -0
  279. package/node_modules/pino/test/fixtures/transport-worker-name.js +24 -0
  280. package/node_modules/pino/test/fixtures/transport-worker.js +15 -0
  281. package/node_modules/pino/test/fixtures/transport-wrong-export-type.js +3 -0
  282. package/node_modules/pino/test/fixtures/ts/to-file-transport-native.mts +15 -0
  283. package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  284. package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +11 -0
  285. package/node_modules/pino/test/fixtures/ts/transpile.cjs +36 -0
  286. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  287. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  288. package/node_modules/pino/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  289. package/node_modules/pino/test/fixtures/ts/transport-main.ts +8 -0
  290. package/node_modules/pino/test/fixtures/ts/transport-string-stdout.ts +8 -0
  291. package/node_modules/pino/test/fixtures/ts/transport-worker.ts +14 -0
  292. package/node_modules/pino/test/formatters.test.js +364 -0
  293. package/node_modules/pino/test/helper.d.ts +4 -0
  294. package/node_modules/pino/test/helper.js +159 -0
  295. package/node_modules/pino/test/hooks.test.js +114 -0
  296. package/node_modules/pino/test/http.test.js +214 -0
  297. package/node_modules/pino/test/internals/version.test.js +17 -0
  298. package/node_modules/pino/test/is-level-enabled.test.js +179 -0
  299. package/node_modules/pino/test/jest/basic.spec.js +10 -0
  300. package/node_modules/pino/test/levels.test.js +810 -0
  301. package/node_modules/pino/test/metadata.test.js +120 -0
  302. package/node_modules/pino/test/mixin-merge-strategy.test.js +57 -0
  303. package/node_modules/pino/test/mixin.test.js +241 -0
  304. package/node_modules/pino/test/multistream.test.js +793 -0
  305. package/node_modules/pino/test/redact.test.js +923 -0
  306. package/node_modules/pino/test/serializers.test.js +257 -0
  307. package/node_modules/pino/test/smoke.js +59 -0
  308. package/node_modules/pino/test/stdout-protection.test.js +41 -0
  309. package/node_modules/pino/test/syncfalse.test.js +186 -0
  310. package/node_modules/pino/test/timestamp-nano.test.js +37 -0
  311. package/node_modules/pino/test/timestamp.test.js +124 -0
  312. package/node_modules/pino/test/transport/big.test.js +42 -0
  313. package/node_modules/pino/test/transport/bundlers-support.test.js +99 -0
  314. package/node_modules/pino/test/transport/caller.test.js +24 -0
  315. package/node_modules/pino/test/transport/core.test.js +818 -0
  316. package/node_modules/pino/test/transport/core.transpiled.test.ts +114 -0
  317. package/node_modules/pino/test/transport/crash.test.js +36 -0
  318. package/node_modules/pino/test/transport/module-link.test.js +241 -0
  319. package/node_modules/pino/test/transport/native-type-stripping.test.mjs +151 -0
  320. package/node_modules/pino/test/transport/node-options.test.js +116 -0
  321. package/node_modules/pino/test/transport/pipeline.test.js +137 -0
  322. package/node_modules/pino/test/transport/preload.test.js +54 -0
  323. package/node_modules/pino/test/transport/repl.test.js +15 -0
  324. package/node_modules/pino/test/transport/sync-false.test.js +79 -0
  325. package/node_modules/pino/test/transport/sync-true.test.js +57 -0
  326. package/node_modules/pino/test/transport/targets.test.js +48 -0
  327. package/node_modules/pino/test/transport/uses-pino-config.test.js +166 -0
  328. package/node_modules/pino/test/transport-stream.test.js +40 -0
  329. package/node_modules/pino/test/types/pino-import.tst.cts +30 -0
  330. package/node_modules/pino/test/types/pino-import.tst.js +73 -0
  331. package/node_modules/pino/test/types/pino-multistream.tst.ts +49 -0
  332. package/node_modules/pino/test/types/pino-top-export.tst.ts +32 -0
  333. package/node_modules/pino/test/types/pino-transport.tst.ts +171 -0
  334. package/node_modules/pino/test/types/pino-type-only.tst.ts +77 -0
  335. package/node_modules/pino/test/types/pino.ts +98 -0
  336. package/node_modules/pino/test/types/pino.tst.ts +681 -0
  337. package/node_modules/pino/test/types/tsconfig.json +10 -0
  338. package/node_modules/pino/tsconfig.json +14 -0
  339. package/node_modules/pino-pretty/.borp.yaml +6 -0
  340. package/node_modules/pino-pretty/.editorconfig +13 -0
  341. package/node_modules/pino-pretty/.github/dependabot.yml +13 -0
  342. package/node_modules/pino-pretty/.github/workflows/ci.yml +83 -0
  343. package/node_modules/pino-pretty/LICENSE +21 -0
  344. package/node_modules/pino-pretty/Readme.md +425 -0
  345. package/node_modules/pino-pretty/SECURITY.md +146 -0
  346. package/node_modules/pino-pretty/benchmark.js +105 -0
  347. package/node_modules/pino-pretty/bin.js +113 -0
  348. package/node_modules/pino-pretty/demo.png +0 -0
  349. package/node_modules/pino-pretty/docs/help.md +24 -0
  350. package/node_modules/pino-pretty/eslint.config.js +5 -0
  351. package/node_modules/pino-pretty/help/help.txt +68 -0
  352. package/node_modules/pino-pretty/index.d.ts +227 -0
  353. package/node_modules/pino-pretty/index.js +234 -0
  354. package/node_modules/pino-pretty/lib/colors.js +134 -0
  355. package/node_modules/pino-pretty/lib/colors.test.js +132 -0
  356. package/node_modules/pino-pretty/lib/constants.js +55 -0
  357. package/node_modules/pino-pretty/lib/pretty.js +171 -0
  358. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.js +69 -0
  359. package/node_modules/pino-pretty/lib/utils/build-safe-sonic-boom.test.js +84 -0
  360. package/node_modules/pino-pretty/lib/utils/create-date.js +26 -0
  361. package/node_modules/pino-pretty/lib/utils/create-date.test.js +20 -0
  362. package/node_modules/pino-pretty/lib/utils/delete-log-property.js +28 -0
  363. package/node_modules/pino-pretty/lib/utils/delete-log-property.test.js +31 -0
  364. package/node_modules/pino-pretty/lib/utils/filter-log.js +99 -0
  365. package/node_modules/pino-pretty/lib/utils/filter-log.test.js +265 -0
  366. package/node_modules/pino-pretty/lib/utils/format-time.js +66 -0
  367. package/node_modules/pino-pretty/lib/utils/format-time.test.js +71 -0
  368. package/node_modules/pino-pretty/lib/utils/get-level-label-data.js +29 -0
  369. package/node_modules/pino-pretty/lib/utils/get-property-value.js +30 -0
  370. package/node_modules/pino-pretty/lib/utils/get-property-value.test.js +31 -0
  371. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.js +38 -0
  372. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-names-opts.test.js +45 -0
  373. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.js +39 -0
  374. package/node_modules/pino-pretty/lib/utils/handle-custom-levels-opts.test.js +47 -0
  375. package/node_modules/pino-pretty/lib/utils/index.js +108 -0
  376. package/node_modules/pino-pretty/lib/utils/index.test.js +37 -0
  377. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.js +41 -0
  378. package/node_modules/pino-pretty/lib/utils/interpret-conditionals.test.js +84 -0
  379. package/node_modules/pino-pretty/lib/utils/is-object.js +7 -0
  380. package/node_modules/pino-pretty/lib/utils/is-object.test.js +10 -0
  381. package/node_modules/pino-pretty/lib/utils/is-valid-date.js +14 -0
  382. package/node_modules/pino-pretty/lib/utils/is-valid-date.test.js +16 -0
  383. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.js +29 -0
  384. package/node_modules/pino-pretty/lib/utils/join-lines-with-indentation.test.js +16 -0
  385. package/node_modules/pino-pretty/lib/utils/noop.js +3 -0
  386. package/node_modules/pino-pretty/lib/utils/noop.test.js +12 -0
  387. package/node_modules/pino-pretty/lib/utils/parse-factory-options.js +171 -0
  388. package/node_modules/pino-pretty/lib/utils/prettify-error-log.js +76 -0
  389. package/node_modules/pino-pretty/lib/utils/prettify-error-log.test.js +143 -0
  390. package/node_modules/pino-pretty/lib/utils/prettify-error.js +54 -0
  391. package/node_modules/pino-pretty/lib/utils/prettify-error.test.js +25 -0
  392. package/node_modules/pino-pretty/lib/utils/prettify-level.js +41 -0
  393. package/node_modules/pino-pretty/lib/utils/prettify-level.test.js +70 -0
  394. package/node_modules/pino-pretty/lib/utils/prettify-message.js +65 -0
  395. package/node_modules/pino-pretty/lib/utils/prettify-message.test.js +287 -0
  396. package/node_modules/pino-pretty/lib/utils/prettify-metadata.js +75 -0
  397. package/node_modules/pino-pretty/lib/utils/prettify-metadata.test.js +170 -0
  398. package/node_modules/pino-pretty/lib/utils/prettify-object.js +115 -0
  399. package/node_modules/pino-pretty/lib/utils/prettify-object.test.js +217 -0
  400. package/node_modules/pino-pretty/lib/utils/prettify-time.js +43 -0
  401. package/node_modules/pino-pretty/lib/utils/prettify-time.test.js +264 -0
  402. package/node_modules/pino-pretty/lib/utils/split-property-key.js +49 -0
  403. package/node_modules/pino-pretty/lib/utils/split-property-key.test.js +29 -0
  404. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.js +18 -0
  405. package/node_modules/pino-pretty/lib/utils/strip-unsafe-control-chars.test.js +9 -0
  406. package/node_modules/pino-pretty/package.json +64 -0
  407. package/node_modules/pino-pretty/test/basic.test.js +1305 -0
  408. package/node_modules/pino-pretty/test/boolean-options.test.js +228 -0
  409. package/node_modules/pino-pretty/test/cli-rc.test.js +275 -0
  410. package/node_modules/pino-pretty/test/cli.test.js +360 -0
  411. package/node_modules/pino-pretty/test/crlf.test.js +33 -0
  412. package/node_modules/pino-pretty/test/error-objects.test.js +494 -0
  413. package/node_modules/pino-pretty/test/example/example.js +33 -0
  414. package/node_modules/pino-pretty/test/helper.js +19 -0
  415. package/node_modules/pino-pretty/test/types/exports.tst.ts +15 -0
  416. package/node_modules/pino-pretty/test/types/pino-pretty.tst.ts +140 -0
  417. package/node_modules/pino-pretty/test/types/tsconfig.json +9 -0
  418. package/package.json +12 -5
  419. package/lib/cli/commands/init.d.ts +0 -1
  420. package/lib/cli/commands/init.js +0 -8
  421. package/node_modules/@types/node/globals.global.d.ts +0 -1
@@ -8,6 +8,8 @@ const pg = require("pg");
8
8
  const pg_copy_streams_1 = require("pg-copy-streams");
9
9
  const cli_1 = require("./cli");
10
10
  const utils_1 = require("./utils");
11
+ const atlas_1 = require("../../atlas");
12
+ const logger_1 = require("../../logger");
11
13
  const readdir = (0, util_1.promisify)(fs.readdir);
12
14
  const pipeline = (0, util_1.promisify)(stream_1.pipeline);
13
15
  async function applySQLSnapshot(dbConfig) {
@@ -24,7 +26,7 @@ async function applySQLSnapshot(dbConfig) {
24
26
  //2. we populate with the schema
25
27
  //3. we calculate the diff
26
28
  pgClient = new pg.Client(connectionProps);
27
- console.info('creating empty tmp database');
29
+ logger_1.logger.info(`Creating the temporary database ${dbConfig.database}_tmp_bis`);
28
30
  await pgClient.connect();
29
31
  try {
30
32
  await pgClient.query(`DROP DATABASE IF EXISTS ${dbConfig.database}_tmp_bis`);
@@ -42,7 +44,7 @@ async function applySQLSnapshot(dbConfig) {
42
44
  await Promise.all([pgClient.connect(), endDbClient.connect()]);
43
45
  let sqlMigration = '';
44
46
  try {
45
- console.info('populating with target schema');
47
+ logger_1.logger.info('Loading the target schema into the temporary database');
46
48
  //we manually install postgis and some extensions. We should do a dump of sql extensions but we are waiting for atlasgo to support this (time of writing : 19/03 - atlasgo released extensions support but not in the community version)
47
49
  let extensionQuery = `
48
50
  create extension if not exists postgis;
@@ -60,7 +62,7 @@ async function applySQLSnapshot(dbConfig) {
60
62
  CREATE TABLE`) //only first occurrence will be replaced
61
63
  .replace(/CREATE SCHEMA IF NOT EXISTS/g, 'CREATE SCHEMA')
62
64
  .replace(/CREATE SCHEMA/g, 'CREATE SCHEMA IF NOT EXISTS'); //ensure all create schema use "if not exists"
63
- //if target database does not contain any directus tables we just need to populate the base schema.
65
+ //if target database does not contain any d9 tables we just need to populate the base schema.
64
66
  const countTablesReq = `
65
67
  SELECT COUNT(*)
66
68
  FROM information_schema.tables
@@ -68,8 +70,8 @@ async function applySQLSnapshot(dbConfig) {
68
70
  `;
69
71
  const countTables = await endDbClient.query(countTablesReq);
70
72
  if (Number(countTables.rows[0].count) === 0) {
71
- //we drop the extension and reapply the schema with directus
72
- console.info('Target database is empty ; populating it and exiting.');
73
+ //we drop the extension and reapply the schema with d9
74
+ logger_1.logger.info('Target database has no d9 tables: creating the schema directly');
73
75
  //note that finally block will be executed, even if we return
74
76
  await endDbClient.query(sqlSchemaWithExtension);
75
77
  }
@@ -86,16 +88,15 @@ async function applySQLSnapshot(dbConfig) {
86
88
  next();
87
89
  },
88
90
  });
89
- console.info('calculating migration diff');
91
+ logger_1.logger.info('Computing the schema diff with atlas');
90
92
  const cli = new cli_1.Cli();
91
- await cli.command('npx', [
92
- 'atlas',
93
+ await cli.command(await (0, atlas_1.ensureAtlas)(), [
93
94
  'schema',
94
95
  'diff',
95
96
  '--from',
96
- `postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
97
+ `postgres://${encodeURIComponent(dbConfig.user)}:${encodeURIComponent(dbConfig.pwd)}@${dbConfig.host}/${dbConfig.database}?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
97
98
  '--to',
98
- `postgres://${dbConfig.user}:${dbConfig.pwd}@${dbConfig.host}/${dbConfig.database}_tmp_bis?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
99
+ `postgres://${encodeURIComponent(dbConfig.user)}:${encodeURIComponent(dbConfig.pwd)}@${dbConfig.host}/${dbConfig.database}_tmp_bis?sslmode=${dbConfig.ssl ? 'require' : 'disable'}`,
99
100
  ], {
100
101
  env: {
101
102
  ...process.env,
@@ -106,6 +107,14 @@ async function applySQLSnapshot(dbConfig) {
106
107
  if (sqlMigration.includes('no changes to be made')) {
107
108
  sqlMigration = '';
108
109
  }
110
+ if (sqlMigration.trim()) {
111
+ const statements = sqlMigration.split('\n').filter((line) => line.trim().endsWith(';')).length;
112
+ logger_1.logger.info(`Schema migration: ${statements} statements`);
113
+ logger_1.logger.debug(sqlMigration);
114
+ }
115
+ else {
116
+ logger_1.logger.info('Schema is up to date');
117
+ }
109
118
  //we apply the diffs in schema and data in one transaction
110
119
  const pgTmpClient = new pg.Client(connectionProps);
111
120
  connectionProps.database = dbConfig.database;
@@ -113,9 +122,8 @@ async function applySQLSnapshot(dbConfig) {
113
122
  await Promise.all([pgClient.connect(), pgTmpClient.connect()]);
114
123
  try {
115
124
  await pgClient.query('BEGIN');
116
- console.info('apply schema');
125
+ logger_1.logger.info('Applying the schema migration');
117
126
  await pgClient.query(sqlMigration);
118
- console.info('apply data');
119
127
  //strategy to apply data :
120
128
  //- remove the constraint
121
129
  //- upsert the data
@@ -123,13 +131,12 @@ async function applySQLSnapshot(dbConfig) {
123
131
  //always be sure the ci user exists
124
132
  await pgClient.query(`
125
133
  INSERT INTO public.directus_users (id, first_name, last_name, email)
126
- VALUES ('49bcde5d-90aa-4be8-ab10-f9ae1a07546f', 'CI', 'Webcapsule', 'ci@webcapsule.io')
134
+ VALUES ('49bcde5d-90aa-4be8-ab10-f9ae1a07546f', 'CI', 'D9-plumbing', 'd9@webcapsule.io')
127
135
  ON CONFLICT DO NOTHING
128
136
  `);
129
137
  //for constraints see this :
130
138
  //https://confluence.atlassian.com/kb/how-to-drop-and-recreate-the-database-constraints-on-postgresql-776812450.html
131
139
  //we get all the constraints except the primary keys
132
- console.info('remove the constraints on the table');
133
140
  const constraints = await pgClient.query(`
134
141
  SELECT nspname, relname, conname, pg_get_constraintdef(pg_constraint.oid)
135
142
  FROM pg_constraint
@@ -139,6 +146,7 @@ async function applySQLSnapshot(dbConfig) {
139
146
  ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC
140
147
  `);
141
148
  //remove the constraints
149
+ logger_1.logger.info(`Dropping ${constraints.rows.length} constraints`);
142
150
  //the query above is both for adding or dropping order. For dropping, we need to reverse the order
143
151
  for (let i = 0; i < constraints.rows.length; i++) {
144
152
  const constraint = constraints.rows[constraints.rows.length - 1 - i];
@@ -147,9 +155,8 @@ async function applySQLSnapshot(dbConfig) {
147
155
  `);
148
156
  }
149
157
  //replace data
150
- console.info('replacing with data');
151
158
  const csvFiles = await readdir('./sql/data');
152
- console.log(csvFiles);
159
+ logger_1.logger.info(`Importing ${csvFiles.filter((file) => file.endsWith('.csv')).length} CSV files from ./sql/data`);
153
160
  for (const file of csvFiles) {
154
161
  if (file.endsWith('.csv')) {
155
162
  const nonParsedTableName = file.slice(0, -4);
@@ -157,15 +164,15 @@ async function applySQLSnapshot(dbConfig) {
157
164
  let copyTableName = originalTableName;
158
165
  let existingRowsCanCauseConflict = false;
159
166
  if (['directus_files', 'directus_folders'].includes(nonParsedTableName)) {
160
- //delete all files and folders that are inside the "common" folder
161
- const commonFolderName = 'common';
167
+ //delete all files and folders that are inside the "d9-plumbing-common" folder
168
+ const commonFolderName = 'd9-plumbing-common';
162
169
  const folderKey = {
163
170
  directus_files: 'folder',
164
171
  directus_folders: 'parent',
165
172
  };
166
173
  await pgClient.query(`
167
174
  WITH RECURSIVE folder_tree AS (
168
- -- Anchor: the "common" folder
175
+ -- Anchor: the "d9-plumbing-common" folder
169
176
  SELECT id
170
177
  FROM directus_folders
171
178
  WHERE name = '${commonFolderName}'
@@ -199,9 +206,9 @@ async function applySQLSnapshot(dbConfig) {
199
206
  const ingestStream = pgClient.query((0, pg_copy_streams_1.from)(`COPY ${copyTableName} (${firstLine}) FROM STDIN DELIMITER ',' CSV HEADER`));
200
207
  const sourceStream = fs.createReadStream(`./sql/data/${file}`);
201
208
  ingestStream.on('close', () => {
202
- console.info(`ingested ${file}`);
209
+ logger_1.logger.debug(`ingested ${file}`);
203
210
  });
204
- console.info(`ingesting ${file}`);
211
+ logger_1.logger.debug(`ingesting ${file}`);
205
212
  await pipeline(sourceStream, ingestStream);
206
213
  if (existingRowsCanCauseConflict) {
207
214
  await pgClient.query(`
@@ -216,7 +223,7 @@ async function applySQLSnapshot(dbConfig) {
216
223
  }
217
224
  }
218
225
  //reestablish the constraints
219
- console.info('reestablish the constraints');
226
+ logger_1.logger.info(`Restoring ${constraints.rows.length} constraints`);
220
227
  for (const constraint of constraints.rows) {
221
228
  await pgClient.query(`
222
229
  ALTER TABLE ${constraint.nspname}."${constraint.relname}" ADD CONSTRAINT "${constraint.conname}" ${constraint.pg_get_constraintdef}
@@ -225,7 +232,6 @@ async function applySQLSnapshot(dbConfig) {
225
232
  //update the sequences
226
233
  //when adding with COPY, all sequences are not up to date
227
234
  //we need to find all sequences and then to find the max on the managed column and then to update the sequence
228
- console.info('find sequences');
229
235
  const sequences = await pgClient.query(`
230
236
  SELECT n.nspname as "schema",
231
237
  c.relname as "name",
@@ -240,8 +246,9 @@ async function applySQLSnapshot(dbConfig) {
240
246
  AND pg_catalog.pg_table_is_visible(c.oid)
241
247
  ORDER BY 1,2;
242
248
  `);
249
+ logger_1.logger.info(`Resetting ${sequences.rows.length} sequences`);
243
250
  for (const seq of sequences.rows) {
244
- console.info(`find column managed by ${seq.name}`);
251
+ logger_1.logger.debug(`find column managed by ${seq.name}`);
245
252
  const relation = await pgClient.query(`
246
253
  SELECT d.refobjid::regclass as "table", a.attname as "field"
247
254
  FROM pg_depend d
@@ -251,28 +258,30 @@ async function applySQLSnapshot(dbConfig) {
251
258
  AND d.refobjsubid > 0
252
259
  AND d.classid = 'pg_class'::regclass;
253
260
  `);
254
- console.info(`find max of ${relation.rows[0].table} ${relation.rows[0].field}`);
261
+ logger_1.logger.debug(`find max of ${relation.rows[0].table} ${relation.rows[0].field}`);
255
262
  const max = await pgClient.query(`
256
263
  SELECT MAX(${relation.rows[0].field})
257
264
  FROM ${relation.rows[0].table}
258
265
  `);
259
266
  if (max.rows[0].max !== null) {
260
- console.info('alter the sequence');
267
+ logger_1.logger.debug(`restart ${seq.name} at ${max.rows[0].max + 1}`);
261
268
  await pgClient.query(`alter sequence ${seq.schema}."${seq.name}" restart with ${max.rows[0].max + 1};`);
262
269
  }
263
270
  }
264
271
  await pgClient.query('COMMIT');
265
- console.log('success');
272
+ logger_1.logger.info('Transaction committed');
266
273
  }
267
274
  catch (e) {
275
+ logger_1.logger.error('Error while applying the snapshot, rolling back the transaction');
268
276
  await pgClient.query('ROLLBACK');
269
- console.log('error');
270
277
  throw e;
271
278
  }
272
279
  finally {
273
280
  await pgClient.end();
274
281
  await pgTmpClient.end();
275
- console.log('end of the query');
276
282
  }
283
+ //schema (collections, fields, relations) is always cached (CACHE_SCHEMA), permissions only when CACHE_ENABLED: a purge is enough.
284
+ //flows, operations and webhooks are loaded in memory at startup and only reloaded by their own services: a restart is needed.
285
+ logger_1.logger.warn('Purge the d9 cache (POST /utils/cache/clear) to take the new schema (and permissions, if CACHE_ENABLED) into account. If flows, operations or webhooks changed, also restart d9.');
277
286
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvYXBwbHktc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQSw0Q0E0U0M7QUF4VEQseUJBQXlCO0FBQ3pCLG1DQUE4RDtBQUM5RCwrQkFBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHFEQUFtRDtBQUNuRCwrQkFBNEI7QUFDNUIsbUNBQThDO0FBRTlDLE1BQU0sT0FBTyxHQUFHLElBQUEsZ0JBQVMsRUFBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBUyxFQUFDLGlCQUFjLENBQUMsQ0FBQztBQUdwQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsUUFNdEM7SUFDQyxJQUFJLFFBQW1CLENBQUM7SUFDeEIsTUFBTSxlQUFlLEdBQW9CO1FBQ3ZDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHO1FBQ3RCLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRSxDQUFDO0lBQ0EsUUFBUTtJQUNSLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsMEJBQTBCO0lBQzVCLFFBQVEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxD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QUFDLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FDbEIsa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNsRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV6QixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBwaXBlbGluZSBhcyBzdHJlYW1QaXBlbGluZSwgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBwZyBmcm9tICdwZyc7XG5pbXBvcnQgeyBmcm9tIGFzIGNvcHlGcm9tIH0gZnJvbSAncGctY29weS1zdHJlYW1zJztcbmltcG9ydCB7IENsaSB9IGZyb20gJy4vY2xpJztcbmltcG9ydCB7IHJlYWRGaXJzdExpbmVPZkZpbGUgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgcmVhZGRpciA9IHByb21pc2lmeShmcy5yZWFkZGlyKTtcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbVBpcGVsaW5lKTtcblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlTUUxTbmFwc2hvdChkYkNvbmZpZzoge1xuICBob3N0OiBzdHJpbmc7XG4gIHVzZXI6IHN0cmluZztcbiAgcHdkOiBzdHJpbmc7XG4gIGRhdGFiYXNlOiBzdHJpbmc7XG4gIHNzbD86IGJvb2xlYW47XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBwZ0NsaWVudDogcGcuQ2xpZW50O1xuICBjb25zdCBjb25uZWN0aW9uUHJvcHM6IHBnLkNsaWVudENvbmZpZyA9IHtcbiAgICB1c2VyOiBkYkNvbmZpZy51c2VyLFxuICAgIGhvc3Q6IGRiQ29uZmlnLmhvc3QsXG4gICAgcGFzc3dvcmQ6IGRiQ29uZmlnLnB3ZCxcbiAgICBkYXRhYmFzZTogJ3Bvc3RncmVzJyxcbiAgICAuLi4oZGJDb25maWcuc3NsID8geyBzc2w6IHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9IH0gOiB7fSksXG4gIH07XG4gICAgLy9TQ0hFTUFcbiAgICAvLzEuIHdlIGNyZWF0ZSBhbiBlbXB0eSBkYlxuICAgIC8vMi4gd2UgcG9wdWxhdGUgd2l0aCB0aGUgc2NoZW1hXG4gICAgLy8zLiB3ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgcGdDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbnNvbGUuaW5mbygnY3JlYXRpbmcgZW1wdHkgdG1wIGRhdGFiYXNlJyk7XG4gIGF3YWl0IHBnQ2xpZW50LmNvbm5lY3QoKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2ApO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBDUkVBVEUgREFUQUJBU0UgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2JpcztgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgfVxuICBjb25uZWN0aW9uUHJvcHMuZGF0YWJhc2UgPSBgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2A7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuXG4gIGNvbnN0IGVuZERiQ2xpZW50ID0gbmV3IHBnLkNsaWVudCh7XG4gICAgLi4uY29ubmVjdGlvblByb3BzLFxuICAgIGRhdGFiYXNlOiBkYkNvbmZpZy5kYXRhYmFzZSxcbiAgfSk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgZW5kRGJDbGllbnQuY29ubmVjdCgpXSk7XG5cbiAgbGV0IHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB0cnkge1xuICAgIGNvbnNvbGUuaW5mbygncG9wdWxhdGluZyB3aXRoIHRhcmdldCBzY2hlbWEnKTtcbiAgICAvL3dlIG1hbnVhbGx5IGluc3RhbGwgcG9zdGdpcyBhbmQgc29tZSBleHRlbnNpb25zLiBXZSBzaG91bGQgZG8gYSBkdW1wIG9mIHNxbCBleHRlbnNpb25zIGJ1dCB3ZSBhcmUgd2FpdGluZyBmb3IgYXRsYXNnbyB0byBzdXBwb3J0IHRoaXMgKHRpbWUgb2Ygd3JpdGluZyA6IDE5LzAzIC0gYXRsYXNnbyByZWxlYXNlZCBleHRlbnNpb25zIHN1cHBvcnQgYnV0IG5vdCBpbiB0aGUgY29tbXVuaXR5IHZlcnNpb24pXG4gICAgbGV0IGV4dGVuc2lvblF1ZXJ5ID0gYFxuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXM7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgZnV6enlzdHJtYXRjaDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3RpZ2VyX2dlb2NvZGVyIDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3Jhc3RlciA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgcG9zdGdpc190b3BvbG9neSA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgYWRkcmVzc19zdGFuZGFyZGl6ZXIgO1xuICAgICAgICBgO1xuICAgIC8vdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGR1bXAgaW4gYXRsYXMgOiBzY2hlbWEgYXJlIGNyZWF0ZWQgd2l0aCBDUkVBVEUgYW5kIG5vdCBjcmVhdGUgaWYgbm90IGV4aXRzLi4uXG4gICAgLy9zbyB3ZSBpbnNlcnQgZXh0ZW5zaW9uIGNyZWF0aW9uIGFmdGVyIHNjaGVtYSBjcmVhdGlvbiBpbiBvcmRlciB0byBhdm9pZCBnZXR0aW5nIFwic2NoZW1hIGFscmVhZHkgZXhpc3RzXCJcbiAgICBjb25zdCBzcWxTY2hlbWEgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3FsL3NjaGVtYS5zcWwnKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNxbFNjaGVtYVdpdGhFeHRlbnNpb24gPSBzcWxTY2hlbWFcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAnQ1JFQVRFIFRBQkxFJyxcbiAgICAgICAgYCR7ZXh0ZW5zaW9uUXVlcnl9XG4gICAgICAgICAgICBDUkVBVEUgVEFCTEVgLFxuICAgICAgKSAvL29ubHkgZmlyc3Qgb2NjdXJyZW5jZSB3aWxsIGJlIHJlcGxhY2VkXG4gICAgICAucmVwbGFjZSgvQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTL2csICdDUkVBVEUgU0NIRU1BJylcbiAgICAgIC5yZXBsYWNlKC9DUkVBVEUgU0NIRU1BL2csICdDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMnKTsgLy9lbnN1cmUgYWxsIGNyZWF0ZSBzY2hlbWEgdXNlIFwiaWYgbm90IGV4aXN0c1wiXG4gICAgLy9pZiB0YXJnZXQgZGF0YWJhc2UgZG9lcyBub3QgY29udGFpbiBhbnkgZGlyZWN0dXMgdGFibGVzIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgYmFzZSBzY2hlbWEuXG4gICAgY29uc3QgY291bnRUYWJsZXNSZXEgPSBgXG4gICAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgXG4gICAgICAgICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgXG4gICAgICAgICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyBBTkQgdGFibGVfbmFtZSBMSUtFICdkaXJlY3R1c18lJztcbiAgICAgICAgYDtcbiAgICBjb25zdCBjb3VudFRhYmxlcyA9IGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KGNvdW50VGFibGVzUmVxKTtcbiAgICBpZiAoTnVtYmVyKGNvdW50VGFibGVzLnJvd3NbMF0uY291bnQpID09PSAwKSB7XG4gICAgICAvL3dlIGRyb3AgdGhlIGV4dGVuc2lvbiBhbmQgcmVhcHBseSB0aGUgc2NoZW1hIHdpdGggZGlyZWN0dXNcbiAgICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IGRhdGFiYXNlIGlzIGVtcHR5IDsgcG9wdWxhdGluZyBpdCBhbmQgZXhpdGluZy4nKTtcbiAgICAgIC8vbm90ZSB0aGF0IGZpbmFsbHkgYmxvY2sgd2lsbCBiZSBleGVjdXRlZCwgZXZlbiBpZiB3ZSByZXR1cm5cbiAgICAgIGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICAgIH1cblxuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KHNxbFNjaGVtYVdpdGhFeHRlbnNpb24pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHBnQ2xpZW50LmVuZCgpO1xuICAgIGF3YWl0IGVuZERiQ2xpZW50LmVuZCgpO1xuICB9XG5cbiAgLy93ZSBjYWxjdWxhdGUgdGhlIGRpZmZcbiAgY29uc3QgbWlncmF0aW9uU3RyZWFtID0gbmV3IFdyaXRhYmxlKHtcbiAgICB3cml0ZTogKGNodW5rLCBfZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHNxbE1pZ3JhdGlvbiArPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgbmV4dCgpO1xuICAgIH0sXG4gIH0pO1xuICBjb25zb2xlLmluZm8oJ2NhbGN1bGF0aW5nIG1pZ3JhdGlvbiBkaWZmJyk7XG4gIGNvbnN0IGNsaSA9IG5ldyBDbGkoKTtcbiAgYXdhaXQgY2xpLmNvbW1hbmQoXG4gICAgJ25weCcsXG4gICAgW1xuICAgICAgJ2F0bGFzJyxcbiAgICAgICdzY2hlbWEnLFxuICAgICAgJ2RpZmYnLFxuICAgICAgJy0tZnJvbScsXG4gICAgICBgcG9zdGdyZXM6Ly8ke2RiQ29uZmlnLnVzZXJ9OiR7ZGJDb25maWcucHdkfUAke2RiQ29uZmlnLmhvc3R9LyR7ZGJDb25maWcuZGF0YWJhc2V9P3NzbG1vZGU9JHtkYkNvbmZpZy5zc2wgPyAncmVxdWlyZScgOiAnZGlzYWJsZSd9YCxcbiAgICAgICctLXRvJyxcbiAgICAgIGBwb3N0Z3JlczovLyR7ZGJDb25maWcudXNlcn06JHtkYkNvbmZpZy5wd2R9QCR7ZGJDb25maWcuaG9zdH0vJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpcz9zc2xtb2RlPSR7ZGJDb25maWcuc3NsID8gJ3JlcXVpcmUnIDogJ2Rpc2FibGUnfWAsXG4gICAgXSxcbiAgICB7XG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIEFUTEFTX05PX1VQREFURV9OT1RJRklFUjogJ3RydWUnLCAvL2lmIG5vdCBzZXQsIGF0bGFzIGVuZCBhIGZpbmFsIGxpbmUgd2l0aCBcImEgbmV3IHZlcnNpb24gb2YgYXRsYXMgaXMgYXZhaWxhYmxlXCJcbiAgICAgIH0sXG4gICAgICBzdGRvdXQ6IG1pZ3JhdGlvblN0cmVhbSxcbiAgICB9LFxuICApO1xuICBpZiAoc3FsTWlncmF0aW9uLmluY2x1ZGVzKCdubyBjaGFuZ2VzIHRvIGJlIG1hZGUnKSkge1xuICAgIHNxbE1pZ3JhdGlvbiA9ICcnO1xuICB9XG4gIC8vd2UgYXBwbHkgdGhlIGRpZmZzIGluIHNjaGVtYSBhbmQgZGF0YSBpbiBvbmUgdHJhbnNhY3Rpb25cbiAgY29uc3QgcGdUbXBDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25Qcm9wcyk7XG4gIGNvbm5lY3Rpb25Qcm9wcy5kYXRhYmFzZSA9IGRiQ29uZmlnLmRhdGFiYXNlO1xuICBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW3BnQ2xpZW50LmNvbm5lY3QoKSwgcGdUbXBDbGllbnQuY29ubmVjdCgpXSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0JFR0lOJyk7XG4gICAgY29uc29sZS5pbmZvKCdhcHBseSBzY2hlbWEnKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxNaWdyYXRpb24pO1xuICAgIGNvbnNvbGUuaW5mbygnYXBwbHkgZGF0YScpO1xuICAgIC8vc3RyYXRlZ3kgdG8gYXBwbHkgZGF0YSA6XG4gICAgLy8tIHJlbW92ZSB0aGUgY29uc3RyYWludFxuICAgIC8vLSB1cHNlcnQgdGhlIGRhdGFcbiAgICAvLy0gYXBwbHkgdGhlIGNvbnN0cmFpbnRcblxuICAgIC8vYWx3YXlzIGJlIHN1cmUgdGhlIGNpIHVzZXIgZXhpc3RzXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuICAgICAgICAgICAgSU5TRVJUIElOVE8gcHVibGljLmRpcmVjdHVzX3VzZXJzIChpZCwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBlbWFpbClcbiAgICAgICAgICAgIFZBTFVFUyAoJzQ5YmNkZTVkLTkwYWEtNGJlOC1hYjEwLWY5YWUxYTA3NTQ2ZicsICdDSScsICdXZWJjYXBzdWxlJywgJ2NpQHdlYmNhcHN1bGUuaW8nKVxuICAgICAgICAgICAgT04gQ09ORkxJQ1QgRE8gTk9USElOR1xuICAgICAgICBgKTtcblxuICAgIC8vZm9yIGNvbnN0cmFpbnRzIHNlZSB0aGlzIDpcbiAgICAvL2h0dHBzOi8vY29uZmx1ZW5jZS5hdGxhc3NpYW4uY29tL2tiL2hvdy10by1kcm9wLWFuZC1yZWNyZWF0ZS10aGUtZGF0YWJhc2UtY29uc3RyYWludHMtb24tcG9zdGdyZXNxbC03NzY4MTI0NTAuaHRtbFxuICAgIC8vd2UgZ2V0IGFsbCB0aGUgY29uc3RyYWludHMgZXhjZXB0IHRoZSBwcmltYXJ5IGtleXNcbiAgICBjb25zb2xlLmluZm8oJ3JlbW92ZSB0aGUgY29uc3RyYWludHMgb24gdGhlIHRhYmxlJyk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1QgbnNwbmFtZSwgcmVsbmFtZSwgY29ubmFtZSwgcGdfZ2V0X2NvbnN0cmFpbnRkZWYocGdfY29uc3RyYWludC5vaWQpXG4gICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnRcbiAgICAgICAgICAgIElOTkVSIEpPSU4gcGdfY2xhc3MgT04gY29ucmVsaWQ9cGdfY2xhc3Mub2lkXG4gICAgICAgICAgICBJTk5FUiBKT0lOIHBnX25hbWVzcGFjZSBPTiBwZ19uYW1lc3BhY2Uub2lkPXBnX2NsYXNzLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgTk9UIG5zcG5hbWUgPSAncGdfY2F0YWxvZycgQU5EIE5PVCBjb250eXBlID0gJ3AnXG4gICAgICAgICAgICBPUkRFUiBCWSBDQVNFIFdIRU4gY29udHlwZT0nZicgVEhFTiAwIEVMU0UgMSBFTkQgREVTQyxjb250eXBlIERFU0MsbnNwbmFtZSBERVNDLHJlbG5hbWUgREVTQyxjb25uYW1lIERFU0NcbiAgICAgICAgYCk7XG5cbiAgICAvL3JlbW92ZSB0aGUgY29uc3RyYWludHNcbiAgICAvL3RoZSBxdWVyeSBhYm92ZSBpcyBib3RoIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgb3JkZXIuIEZvciBkcm9wcGluZywgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzLnJvd3NbY29uc3RyYWludHMucm93cy5sZW5ndGggLSAxIC0gaV07XG4gICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb25zdHJhaW50Lm5zcG5hbWV9LlwiJHtjb25zdHJhaW50LnJlbG5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtjb25zdHJhaW50LmNvbm5hbWV9XCJcbiAgICAgICAgICAgIGApO1xuICAgIH1cblxuICAgIC8vcmVwbGFjZSBkYXRhXG4gICAgY29uc29sZS5pbmZvKCdyZXBsYWNpbmcgd2l0aCBkYXRhJyk7XG4gICAgY29uc3QgY3N2RmlsZXMgPSBhd2FpdCByZWFkZGlyKCcuL3NxbC9kYXRhJyk7XG4gICAgY29uc29sZS5sb2coY3N2RmlsZXMpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBjc3ZGaWxlcykge1xuICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy5jc3YnKSkge1xuICAgICAgICBjb25zdCBub25QYXJzZWRUYWJsZU5hbWUgPSBmaWxlLnNsaWNlKDAsIC00KTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUYWJsZU5hbWUgPSBwZy5lc2NhcGVJZGVudGlmaWVyKG5vblBhcnNlZFRhYmxlTmFtZSk7XG4gICAgICAgIGxldCBjb3B5VGFibGVOYW1lID0gb3JpZ2luYWxUYWJsZU5hbWU7XG4gICAgICAgIGxldCBleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChbJ2RpcmVjdHVzX2ZpbGVzJywgJ2RpcmVjdHVzX2ZvbGRlcnMnXS5pbmNsdWRlcyhub25QYXJzZWRUYWJsZU5hbWUpKSB7XG4gICAgICAgICAgLy9kZWxldGUgYWxsIGZpbGVzIGFuZCBmb2xkZXJzIHRoYXQgYXJlIGluc2lkZSB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICBjb25zdCBjb21tb25Gb2xkZXJOYW1lID0gJ2NvbW1vbic7XG4gICAgICAgICAgY29uc3QgZm9sZGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgZGlyZWN0dXNfZmlsZXM6ICdmb2xkZXInLFxuICAgICAgICAgICAgZGlyZWN0dXNfZm9sZGVyczogJ3BhcmVudCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgIFxuICAgICAgICAgICAgICAgICAgICAgICAgV0lUSCBSRUNVUlNJVkUgZm9sZGVyX3RyZWUgQVMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gQW5jaG9yOiB0aGUgXCJjb21tb25cIiBmb2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gJyR7Y29tbW9uRm9sZGVyTmFtZX0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFJlY3Vyc2l2ZSBzdGVwOiBmaW5kIHN1YmZvbGRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgZi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gZGlyZWN0dXNfZm9sZGVycyBmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9JTiBmb2xkZXJfdHJlZSBmdCBPTiBmLnBhcmVudCA9IGZ0LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSBwdWJsaWMuJHtjb3B5VGFibGVOYW1lfSBBUyB0XG4gICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSB0LiR7Zm9sZGVyS2V5W25vblBhcnNlZFRhYmxlTmFtZV19IElOIChTRUxFQ1QgaWQgRlJPTSBmb2xkZXJfdHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICBpZiAobm9uUGFyc2VkVGFibGVOYW1lID09PSAnZGlyZWN0dXNfZm9sZGVycycpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nUm93c0NhbkNhdXNlQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgREVMRVRFIEZST00gcHVibGljLiR7Y29weVRhYmxlTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCkge1xuICAgICAgICAgIC8vd2Ugd2lsbCBpbXBvcnQgZGF0YSBpbiBhIHRlbXBvcmFyeSB0YWJsZSwgdGhlbiBkbyB0aGUgaW5zZXJ0XG4gICAgICAgICAgY29weVRhYmxlTmFtZSA9IHBnLmVzY2FwZUlkZW50aWZpZXIoYCR7bm9uUGFyc2VkVGFibGVOYW1lfV93YmNlX3RtcGApO1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgICAgYENSRUFURSBURU1QIFRBQkxFICR7Y29weVRhYmxlTmFtZX0gT04gQ09NTUlUIERST1AgQVMgU0VMRUNUICogRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX0gV0lUSCBOTyBEQVRBYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVhZCBmaXJzdCBsaW5lXG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBhd2FpdCByZWFkRmlyc3RMaW5lT2ZGaWxlKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgZmlyc3RMaW5lID0gZmlyc3RMaW5lXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKChjKSA9PiBgXCIke2N9XCJgKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IGluZ2VzdFN0cmVhbSA9IHBnQ2xpZW50LnF1ZXJ5KFxuICAgICAgICAgIGNvcHlGcm9tKFxuICAgICAgICAgICAgYENPUFkgJHtjb3B5VGFibGVOYW1lfSAoJHtmaXJzdExpbmV9KSAgRlJPTSBTVERJTiAgREVMSU1JVEVSICcsJyBDU1YgSEVBREVSYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3VyY2VTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGAuL3NxbC9kYXRhLyR7ZmlsZX1gKTtcbiAgICAgICAgaW5nZXN0U3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYGluZ2VzdGVkICR7ZmlsZX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgaW5nZXN0aW5nICR7ZmlsZX1gKTtcblxuICAgICAgICBhd2FpdCBwaXBlbGluZShzb3VyY2VTdHJlYW0sIGluZ2VzdFN0cmVhbSk7XG4gICAgICAgIGlmIChleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0KSB7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRERUxFVEUgRlJPTSBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0V0hFUkUgaWQgSU4gKFNFTEVDVCBpZCBGUk9NICR7Y29weVRhYmxlTmFtZX0pO1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuXHRcdFx0XHRcdFx0XHRJTlNFUlQgSU5UTyBwdWJsaWMuJHtvcmlnaW5hbFRhYmxlTmFtZX1cblx0XHRcdFx0XHRcdFx0U0VMRUNUICogRlJPTSAke2NvcHlUYWJsZU5hbWV9O1xuXHRcdFx0XHRcdFx0YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3JlZXN0YWJsaXNoIHRoZSBjb25zdHJhaW50c1xuICAgIGNvbnNvbGUuaW5mbygncmVlc3RhYmxpc2ggdGhlIGNvbnN0cmFpbnRzJyk7XG4gICAgZm9yIChjb25zdCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzLnJvd3MpIHtcbiAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnN0cmFpbnQubnNwbmFtZX0uXCIke2NvbnN0cmFpbnQucmVsbmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7Y29uc3RyYWludC5jb25uYW1lfVwiICAke2NvbnN0cmFpbnQucGdfZ2V0X2NvbnN0cmFpbnRkZWZ9XG4gICAgICAgICAgICBgKTtcbiAgICB9XG5cbiAgICAvL3VwZGF0ZSB0aGUgc2VxdWVuY2VzXG4gICAgLy93aGVuIGFkZGluZyB3aXRoIENPUFksIGFsbCBzZXF1ZW5jZXMgYXJlIG5vdCB1cCB0byBkYXRlXG4gICAgLy93ZSBuZWVkIHRvIGZpbmQgYWxsIHNlcXVlbmNlcyBhbmQgdGhlbiB0byBmaW5kIHRoZSBtYXggb24gdGhlIG1hbmFnZWQgY29sdW1uIGFuZCB0aGVuIHRvIHVwZGF0ZSB0aGUgc2VxdWVuY2VcblxuICAgIGNvbnNvbGUuaW5mbygnZmluZCBzZXF1ZW5jZXMnKTtcbiAgICBjb25zdCBzZXF1ZW5jZXMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1Qgbi5uc3BuYW1lIGFzIFwic2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgYy5yZWxuYW1lIGFzIFwibmFtZVwiLFxuICAgICAgICAgICAgICAgIENBU0UgYy5yZWxraW5kIFdIRU4gJ3InIFRIRU4gJ3RhYmxlJyBXSEVOICd2JyBUSEVOICd2aWV3JyBXSEVOICdtJyBUSEVOICdtYXRlcmlhbGl6ZWQgdmlldycgV0hFTiAnaScgVEhFTiAnaW5kZXgnIFdIRU4gJ1MnIFRIRU4gJ3NlcXVlbmNlJyBXSEVOICdzJyBUSEVOICdzcGVjaWFsJyBXSEVOICd0JyBUSEVOICdUT0FTVCB0YWJsZScgV0hFTiAnZicgVEhFTiAnZm9yZWlnbiB0YWJsZScgV0hFTiAncCcgVEhFTiAncGFydGl0aW9uZWQgdGFibGUnIFdIRU4gJ0knIFRIRU4gJ3BhcnRpdGlvbmVkIGluZGV4JyBFTkQgYXMgXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcGdfY2F0YWxvZy5wZ19nZXRfdXNlcmJ5aWQoYy5yZWxvd25lcikgYXMgXCJPd25lclwiXG4gICAgICAgICAgICBGUk9NIHBnX2NhdGFsb2cucGdfY2xhc3MgY1xuICAgICAgICAgICAgICAgIExFRlQgSk9JTiBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgICAgICAgIFdIRVJFIGMucmVsa2luZCBJTiAoJ1MnLCcnKVxuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ3BnX2NhdGFsb2cnXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSAhfiAnXnBnX3RvYXN0J1xuICAgICAgICAgICAgICAgIEFORCBuLm5zcG5hbWUgPD4gJ2luZm9ybWF0aW9uX3NjaGVtYSdcbiAgICAgICAgICAgIEFORCBwZ19jYXRhbG9nLnBnX3RhYmxlX2lzX3Zpc2libGUoYy5vaWQpXG4gICAgICAgICAgICBPUkRFUiBCWSAxLDI7XG4gICAgICAgIGApO1xuXG4gICAgZm9yIChjb25zdCBzZXEgb2Ygc2VxdWVuY2VzLnJvd3MpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgZmluZCBjb2x1bW4gbWFuYWdlZCBieSAke3NlcS5uYW1lfWApO1xuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIGQucmVmb2JqaWQ6OnJlZ2NsYXNzIGFzIFwidGFibGVcIiwgYS5hdHRuYW1lIGFzIFwiZmllbGRcIlxuICAgICAgICAgICAgICAgIEZST00gICBwZ19kZXBlbmQgICAgZFxuICAgICAgICAgICAgICAgIEpPSU4gICBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dHJlbGlkID0gZC5yZWZvYmppZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGEuYXR0bnVtICAgPSBkLnJlZm9ianN1YmlkXG4gICAgICAgICAgICAgICAgV0hFUkUgIGQub2JqaWQgPSAnJHtzZXEuc2NoZW1hfS5cIiR7c2VxLm5hbWV9XCInOjpyZWdjbGFzc1xuICAgICAgICAgICAgICAgIEFORCAgICBkLnJlZm9ianN1YmlkID4gMFxuICAgICAgICAgICAgICAgIEFORCAgICBkLmNsYXNzaWQgPSAncGdfY2xhc3MnOjpyZWdjbGFzcztcbiAgICAgICAgICAgIGApO1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgZmluZCBtYXggb2YgJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfSAke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXggPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgU0VMRUNUIE1BWCgke3JlbGF0aW9uLnJvd3NbMF0uZmllbGR9KVxuICAgICAgICAgICAgICAgIEZST00gJHtyZWxhdGlvbi5yb3dzWzBdLnRhYmxlfVxuICAgICAgICAgICAgYCk7XG5cbiAgICAgIGlmIChtYXgucm93c1swXS5tYXggIT09IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdhbHRlciB0aGUgc2VxdWVuY2UnKTtcbiAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoXG4gICAgICAgICAgYGFsdGVyIHNlcXVlbmNlICR7c2VxLnNjaGVtYX0uXCIke3NlcS5uYW1lfVwiIHJlc3RhcnQgd2l0aCAke21heC5yb3dzWzBdLm1heCArIDF9O2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoJ0NPTU1JVCcpO1xuICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzJyk7XG5cbiAgfSBjYXRjaCAoZSkge1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KCdST0xMQkFDSycpO1xuICAgIGNvbnNvbGUubG9nKCdlcnJvcicpO1xuXG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBwZ1RtcENsaWVudC5lbmQoKTtcbiAgICBjb25zb2xlLmxvZygnZW5kIG9mIHRoZSBxdWVyeScpO1xuICB9XG59XG5cbiJdfQ==
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL3NhdmUvYXBwbHktc25hcHNob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSw0Q0FrVEM7QUFoVUQseUJBQXlCO0FBQ3pCLG1DQUE4RDtBQUM5RCwrQkFBaUM7QUFDakMseUJBQXlCO0FBQ3pCLHFEQUFtRDtBQUNuRCwrQkFBNEI7QUFDNUIsbUNBQThDO0FBQzlDLHVDQUEwQztBQUMxQyx5Q0FBc0M7QUFFdEMsTUFBTSxPQUFPLEdBQUcsSUFBQSxnQkFBUyxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFBLGdCQUFTLEVBQUMsaUJBQWMsQ0FBQyxDQUFDO0FBR3BDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxRQU10QztJQUNDLElBQUksUUFBbUIsQ0FBQztJQUN4QixNQUFNLGVBQWUsR0FBb0I7UUFDdkMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUc7UUFDdEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2hFLENBQUM7SUFDQSxRQUFRO0lBQ1IsMEJBQTBCO0lBQzFCLGdDQUFnQztJQUNoQywwQkFBMEI7SUFDNUIsUUFBUSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxQyxlQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxRQUFRLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQztJQUM1RSxNQUFNLFFBQVEsQ0FBQyxP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SSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFdkMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxlQUFNLENBQUMsS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0Qsa0lBQWtJO0lBQ2xJLDhIQUE4SDtJQUM5SCxlQUFNLENBQUMsSUFBSSxDQUFDLGtMQUFrTCxDQUFDLENBQUM7QUFDbE0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHBpcGVsaW5lIGFzIHN0cmVhbVBpcGVsaW5lLCBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIHBnIGZyb20gJ3BnJztcbmltcG9ydCB7IGZyb20gYXMgY29weUZyb20gfSBmcm9tICdwZy1jb3B5LXN0cmVhbXMnO1xuaW1wb3J0IHsgQ2xpIH0gZnJvbSAnLi9jbGknO1xuaW1wb3J0IHsgcmVhZEZpcnN0TGluZU9mRmlsZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZW5zdXJlQXRsYXMgfSBmcm9tICcuLi8uLi9hdGxhcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuXG5jb25zdCByZWFkZGlyID0gcHJvbWlzaWZ5KGZzLnJlYWRkaXIpO1xuY29uc3QgcGlwZWxpbmUgPSBwcm9taXNpZnkoc3RyZWFtUGlwZWxpbmUpO1xuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVNRTFNuYXBzaG90KGRiQ29uZmlnOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgdXNlcjogc3RyaW5nO1xuICBwd2Q6IHN0cmluZztcbiAgZGF0YWJhc2U6IHN0cmluZztcbiAgc3NsPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHBnQ2xpZW50OiBwZy5DbGllbnQ7XG4gIGNvbnN0IGNvbm5lY3Rpb25Qcm9wczogcGcuQ2xpZW50Q29uZmlnID0ge1xuICAgIHVzZXI6IGRiQ29uZmlnLnVzZXIsXG4gICAgaG9zdDogZGJDb25maWcuaG9zdCxcbiAgICBwYXNzd29yZDogZGJDb25maWcucHdkLFxuICAgIGRhdGFiYXNlOiAncG9zdGdyZXMnLFxuICAgIC4uLihkYkNvbmZpZy5zc2wgPyB7IHNzbDogeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0gfSA6IHt9KSxcbiAgfTtcbiAgICAvL1NDSEVNQVxuICAgIC8vMS4gd2UgY3JlYXRlIGFuIGVtcHR5IGRiXG4gICAgLy8yLiB3ZSBwb3B1bGF0ZSB3aXRoIHRoZSBzY2hlbWFcbiAgICAvLzMuIHdlIGNhbGN1bGF0ZSB0aGUgZGlmZlxuICBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIHRoZSB0ZW1wb3JhcnkgZGF0YWJhc2UgJHtkYkNvbmZpZy5kYXRhYmFzZX1fdG1wX2Jpc2ApO1xuICBhd2FpdCBwZ0NsaWVudC5jb25uZWN0KCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7ZGJDb25maWcuZGF0YWJhc2V9X3RtcF9iaXNgKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgQ1JFQVRFIERBVEFCQVNFICR7ZGJDb25maWcuZGF0YWJhc2V9X3RtcF9iaXM7YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcGdDbGllbnQuZW5kKCk7XG4gIH1cbiAgY29ubmVjdGlvblByb3BzLmRhdGFiYXNlID0gYCR7ZGJDb25maWcuZGF0YWJhc2V9X3RtcF9iaXNgO1xuICBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcblxuICBjb25zdCBlbmREYkNsaWVudCA9IG5ldyBwZy5DbGllbnQoe1xuICAgIC4uLmNvbm5lY3Rpb25Qcm9wcyxcbiAgICBkYXRhYmFzZTogZGJDb25maWcuZGF0YWJhc2UsXG4gIH0pO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFtwZ0NsaWVudC5jb25uZWN0KCksIGVuZERiQ2xpZW50LmNvbm5lY3QoKV0pO1xuXG4gIGxldCBzcWxNaWdyYXRpb24gPSAnJztcbiAgdHJ5IHtcbiAgICBsb2dnZXIuaW5mbygnTG9hZGluZyB0aGUgdGFyZ2V0IHNjaGVtYSBpbnRvIHRoZSB0ZW1wb3JhcnkgZGF0YWJhc2UnKTtcbiAgICAvL3dlIG1hbnVhbGx5IGluc3RhbGwgcG9zdGdpcyBhbmQgc29tZSBleHRlbnNpb25zLiBXZSBzaG91bGQgZG8gYSBkdW1wIG9mIHNxbCBleHRlbnNpb25zIGJ1dCB3ZSBhcmUgd2FpdGluZyBmb3IgYXRsYXNnbyB0byBzdXBwb3J0IHRoaXMgKHRpbWUgb2Ygd3JpdGluZyA6IDE5LzAzIC0gYXRsYXNnbyByZWxlYXNlZCBleHRlbnNpb25zIHN1cHBvcnQgYnV0IG5vdCBpbiB0aGUgY29tbXVuaXR5IHZlcnNpb24pXG4gICAgbGV0IGV4dGVuc2lvblF1ZXJ5ID0gYFxuICAgICAgICAgICAgY3JlYXRlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzIHBvc3RnaXM7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgZnV6enlzdHJtYXRjaDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3RpZ2VyX2dlb2NvZGVyIDtcbiAgICAgICAgICAgIGNyZWF0ZSBleHRlbnNpb24gaWYgbm90IGV4aXN0cyBwb3N0Z2lzX3Jhc3RlciA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgcG9zdGdpc190b3BvbG9neSA7XG4gICAgICAgICAgICBjcmVhdGUgZXh0ZW5zaW9uIGlmIG5vdCBleGlzdHMgYWRkcmVzc19zdGFuZGFyZGl6ZXIgO1xuICAgICAgICBgO1xuICAgIC8vdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGR1bXAgaW4gYXRsYXMgOiBzY2hlbWEgYXJlIGNyZWF0ZWQgd2l0aCBDUkVBVEUgYW5kIG5vdCBjcmVhdGUgaWYgbm90IGV4aXRzLi4uXG4gICAgLy9zbyB3ZSBpbnNlcnQgZXh0ZW5zaW9uIGNyZWF0aW9uIGFmdGVyIHNjaGVtYSBjcmVhdGlvbiBpbiBvcmRlciB0byBhdm9pZCBnZXR0aW5nIFwic2NoZW1hIGFscmVhZHkgZXhpc3RzXCJcbiAgICBjb25zdCBzcWxTY2hlbWEgPSBmcy5yZWFkRmlsZVN5bmMoJy4vc3FsL3NjaGVtYS5zcWwnKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHNxbFNjaGVtYVdpdGhFeHRlbnNpb24gPSBzcWxTY2hlbWFcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAnQ1JFQVRFIFRBQkxFJyxcbiAgICAgICAgYCR7ZXh0ZW5zaW9uUXVlcnl9XG4gICAgICAgICAgICBDUkVBVEUgVEFCTEVgLFxuICAgICAgKSAvL29ubHkgZmlyc3Qgb2NjdXJyZW5jZSB3aWxsIGJlIHJlcGxhY2VkXG4gICAgICAucmVwbGFjZSgvQ1JFQVRFIFNDSEVNQSBJRiBOT1QgRVhJU1RTL2csICdDUkVBVEUgU0NIRU1BJylcbiAgICAgIC5yZXBsYWNlKC9DUkVBVEUgU0NIRU1BL2csICdDUkVBVEUgU0NIRU1BIElGIE5PVCBFWElTVFMnKTsgLy9lbnN1cmUgYWxsIGNyZWF0ZSBzY2hlbWEgdXNlIFwiaWYgbm90IGV4aXN0c1wiXG4gICAgLy9pZiB0YXJnZXQgZGF0YWJhc2UgZG9lcyBub3QgY29udGFpbiBhbnkgZDkgdGFibGVzIHdlIGp1c3QgbmVlZCB0byBwb3B1bGF0ZSB0aGUgYmFzZSBzY2hlbWEuXG4gICAgY29uc3QgY291bnRUYWJsZXNSZXEgPSBgXG4gICAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgXG4gICAgICAgICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgXG4gICAgICAgICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyBBTkQgdGFibGVfbmFtZSBMSUtFICdkaXJlY3R1c18lJztcbiAgICAgICAgYDtcbiAgICBjb25zdCBjb3VudFRhYmxlcyA9IGF3YWl0IGVuZERiQ2xpZW50LnF1ZXJ5KGNvdW50VGFibGVzUmVxKTtcbiAgICBpZiAoTnVtYmVyKGNvdW50VGFibGVzLnJvd3NbMF0uY291bnQpID09PSAwKSB7XG4gICAgICAvL3dlIGRyb3AgdGhlIGV4dGVuc2lvbiBhbmQgcmVhcHBseSB0aGUgc2NoZW1hIHdpdGggZDlcbiAgICAgIGxvZ2dlci5pbmZvKCdUYXJnZXQgZGF0YWJhc2UgaGFzIG5vIGQ5IHRhYmxlczogY3JlYXRpbmcgdGhlIHNjaGVtYSBkaXJlY3RseScpO1xuICAgICAgLy9ub3RlIHRoYXQgZmluYWxseSBibG9jayB3aWxsIGJlIGV4ZWN1dGVkLCBldmVuIGlmIHdlIHJldHVyblxuICAgICAgYXdhaXQgZW5kRGJDbGllbnQucXVlcnkoc3FsU2NoZW1hV2l0aEV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoc3FsU2NoZW1hV2l0aEV4dGVuc2lvbik7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcGdDbGllbnQuZW5kKCk7XG4gICAgYXdhaXQgZW5kRGJDbGllbnQuZW5kKCk7XG4gIH1cblxuICAvL3dlIGNhbGN1bGF0ZSB0aGUgZGlmZlxuICBjb25zdCBtaWdyYXRpb25TdHJlYW0gPSBuZXcgV3JpdGFibGUoe1xuICAgIHdyaXRlOiAoY2h1bmssIF9lbmNvZGluZywgbmV4dCkgPT4ge1xuICAgICAgc3FsTWlncmF0aW9uICs9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKCdDb21wdXRpbmcgdGhlIHNjaGVtYSBkaWZmIHdpdGggYXRsYXMnKTtcbiAgY29uc3QgY2xpID0gbmV3IENsaSgpO1xuICBhd2FpdCBjbGkuY29tbWFuZChcbiAgICBhd2FpdCBlbnN1cmVBdGxhcygpLFxuICAgIFtcbiAgICAgICdzY2hlbWEnLFxuICAgICAgJ2RpZmYnLFxuICAgICAgJy0tZnJvbScsXG4gICAgICBgcG9zdGdyZXM6Ly8ke2VuY29kZVVSSUNvbXBvbmVudChkYkNvbmZpZy51c2VyKX06JHtlbmNvZGVVUklDb21wb25lbnQoZGJDb25maWcucHdkKX1AJHtkYkNvbmZpZy5ob3N0fS8ke2RiQ29uZmlnLmRhdGFiYXNlfT9zc2xtb2RlPSR7ZGJDb25maWcuc3NsID8gJ3JlcXVpcmUnIDogJ2Rpc2FibGUnfWAsXG4gICAgICAnLS10bycsXG4gICAgICBgcG9zdGdyZXM6Ly8ke2VuY29kZVVSSUNvbXBvbmVudChkYkNvbmZpZy51c2VyKX06JHtlbmNvZGVVUklDb21wb25lbnQoZGJDb25maWcucHdkKX1AJHtkYkNvbmZpZy5ob3N0fS8ke2RiQ29uZmlnLmRhdGFiYXNlfV90bXBfYmlzP3NzbG1vZGU9JHtkYkNvbmZpZy5zc2wgPyAncmVxdWlyZScgOiAnZGlzYWJsZSd9YCxcbiAgICBdLFxuICAgIHtcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgQVRMQVNfTk9fVVBEQVRFX05PVElGSUVSOiAndHJ1ZScsIC8vaWYgbm90IHNldCwgYXRsYXMgZW5kIGEgZmluYWwgbGluZSB3aXRoIFwiYSBuZXcgdmVyc2lvbiBvZiBhdGxhcyBpcyBhdmFpbGFibGVcIlxuICAgICAgfSxcbiAgICAgIHN0ZG91dDogbWlncmF0aW9uU3RyZWFtLFxuICAgIH0sXG4gICk7XG4gIGlmIChzcWxNaWdyYXRpb24uaW5jbHVkZXMoJ25vIGNoYW5nZXMgdG8gYmUgbWFkZScpKSB7XG4gICAgc3FsTWlncmF0aW9uID0gJyc7XG4gIH1cbiAgaWYgKHNxbE1pZ3JhdGlvbi50cmltKCkpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gc3FsTWlncmF0aW9uLnNwbGl0KCdcXG4nKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpLmVuZHNXaXRoKCc7JykpLmxlbmd0aDtcbiAgICBsb2dnZXIuaW5mbyhgU2NoZW1hIG1pZ3JhdGlvbjogJHtzdGF0ZW1lbnRzfSBzdGF0ZW1lbnRzYCk7XG4gICAgbG9nZ2VyLmRlYnVnKHNxbE1pZ3JhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjaGVtYSBpcyB1cCB0byBkYXRlJyk7XG4gIH1cbiAgLy93ZSBhcHBseSB0aGUgZGlmZnMgaW4gc2NoZW1hIGFuZCBkYXRhIGluIG9uZSB0cmFuc2FjdGlvblxuICBjb25zdCBwZ1RtcENsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblByb3BzKTtcbiAgY29ubmVjdGlvblByb3BzLmRhdGFiYXNlID0gZGJDb25maWcuZGF0YWJhc2U7XG4gIHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uUHJvcHMpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbcGdDbGllbnQuY29ubmVjdCgpLCBwZ1RtcENsaWVudC5jb25uZWN0KCldKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeSgnQkVHSU4nKTtcbiAgICBsb2dnZXIuaW5mbygnQXBwbHlpbmcgdGhlIHNjaGVtYSBtaWdyYXRpb24nKTtcbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShzcWxNaWdyYXRpb24pO1xuICAgIC8vc3RyYXRlZ3kgdG8gYXBwbHkgZGF0YSA6XG4gICAgLy8tIHJlbW92ZSB0aGUgY29uc3RyYWludFxuICAgIC8vLSB1cHNlcnQgdGhlIGRhdGFcbiAgICAvLy0gYXBwbHkgdGhlIGNvbnN0cmFpbnRcblxuICAgIC8vYWx3YXlzIGJlIHN1cmUgdGhlIGNpIHVzZXIgZXhpc3RzXG4gICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYFxuICAgICAgICAgICAgSU5TRVJUIElOVE8gcHVibGljLmRpcmVjdHVzX3VzZXJzIChpZCwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBlbWFpbClcbiAgICAgICAgICAgIFZBTFVFUyAoJzQ5YmNkZTVkLTkwYWEtNGJlOC1hYjEwLWY5YWUxYTA3NTQ2ZicsICdDSScsICdEOS1wbHVtYmluZycsICdkOUB3ZWJjYXBzdWxlLmlvJylcbiAgICAgICAgICAgIE9OIENPTkZMSUNUIERPIE5PVEhJTkdcbiAgICAgICAgYCk7XG5cbiAgICAvL2ZvciBjb25zdHJhaW50cyBzZWUgdGhpcyA6XG4gICAgLy9odHRwczovL2NvbmZsdWVuY2UuYXRsYXNzaWFuLmNvbS9rYi9ob3ctdG8tZHJvcC1hbmQtcmVjcmVhdGUtdGhlLWRhdGFiYXNlLWNvbnN0cmFpbnRzLW9uLXBvc3RncmVzcWwtNzc2ODEyNDUwLmh0bWxcbiAgICAvL3dlIGdldCBhbGwgdGhlIGNvbnN0cmFpbnRzIGV4Y2VwdCB0aGUgcHJpbWFyeSBrZXlzXG4gICAgY29uc3QgY29uc3RyYWludHMgPSBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICBTRUxFQ1QgbnNwbmFtZSwgcmVsbmFtZSwgY29ubmFtZSwgcGdfZ2V0X2NvbnN0cmFpbnRkZWYocGdfY29uc3RyYWludC5vaWQpXG4gICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnRcbiAgICAgICAgICAgIElOTkVSIEpPSU4gcGdfY2xhc3MgT04gY29ucmVsaWQ9cGdfY2xhc3Mub2lkXG4gICAgICAgICAgICBJTk5FUiBKT0lOIHBnX25hbWVzcGFjZSBPTiBwZ19uYW1lc3BhY2Uub2lkPXBnX2NsYXNzLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgTk9UIG5zcG5hbWUgPSAncGdfY2F0YWxvZycgQU5EIE5PVCBjb250eXBlID0gJ3AnXG4gICAgICAgICAgICBPUkRFUiBCWSBDQVNFIFdIRU4gY29udHlwZT0nZicgVEhFTiAwIEVMU0UgMSBFTkQgREVTQyxjb250eXBlIERFU0MsbnNwbmFtZSBERVNDLHJlbG5hbWUgREVTQyxjb25uYW1lIERFU0NcbiAgICAgICAgYCk7XG5cbiAgICAvL3JlbW92ZSB0aGUgY29uc3RyYWludHNcbiAgICBsb2dnZXIuaW5mbyhgRHJvcHBpbmcgJHtjb25zdHJhaW50cy5yb3dzLmxlbmd0aH0gY29uc3RyYWludHNgKTtcbiAgICAvL3RoZSBxdWVyeSBhYm92ZSBpcyBib3RoIGZvciBhZGRpbmcgb3IgZHJvcHBpbmcgb3JkZXIuIEZvciBkcm9wcGluZywgd2UgbmVlZCB0byByZXZlcnNlIHRoZSBvcmRlclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc3RyYWludHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzLnJvd3NbY29uc3RyYWludHMucm93cy5sZW5ndGggLSAxIC0gaV07XG4gICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShgXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb25zdHJhaW50Lm5zcG5hbWV9LlwiJHtjb25zdHJhaW50LnJlbG5hbWV9XCIgRFJPUCBDT05TVFJBSU5UIFwiJHtjb25zdHJhaW50LmNvbm5hbWV9XCJcbiAgICAgICAgICAgIGApO1xuICAgIH1cblxuICAgIC8vcmVwbGFjZSBkYXRhXG4gICAgY29uc3QgY3N2RmlsZXMgPSBhd2FpdCByZWFkZGlyKCcuL3NxbC9kYXRhJyk7XG4gICAgbG9nZ2VyLmluZm8oYEltcG9ydGluZyAke2NzdkZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmNzdicpKS5sZW5ndGh9IENTViBmaWxlcyBmcm9tIC4vc3FsL2RhdGFgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgY3N2RmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcuY3N2JykpIHtcbiAgICAgICAgY29uc3Qgbm9uUGFyc2VkVGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtNCk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVGFibGVOYW1lID0gcGcuZXNjYXBlSWRlbnRpZmllcihub25QYXJzZWRUYWJsZU5hbWUpO1xuICAgICAgICBsZXQgY29weVRhYmxlTmFtZSA9IG9yaWdpbmFsVGFibGVOYW1lO1xuICAgICAgICBsZXQgZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCA9IGZhbHNlO1xuICAgICAgICBpZiAoWydkaXJlY3R1c19maWxlcycsICdkaXJlY3R1c19mb2xkZXJzJ10uaW5jbHVkZXMobm9uUGFyc2VkVGFibGVOYW1lKSkge1xuICAgICAgICAgIC8vZGVsZXRlIGFsbCBmaWxlcyBhbmQgZm9sZGVycyB0aGF0IGFyZSBpbnNpZGUgdGhlIFwiZDktcGx1bWJpbmctY29tbW9uXCIgZm9sZGVyXG4gICAgICAgICAgY29uc3QgY29tbW9uRm9sZGVyTmFtZSA9ICdkOS1wbHVtYmluZy1jb21tb24nO1xuICAgICAgICAgIGNvbnN0IGZvbGRlcktleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIGRpcmVjdHVzX2ZpbGVzOiAnZm9sZGVyJyxcbiAgICAgICAgICAgIGRpcmVjdHVzX2ZvbGRlcnM6ICdwYXJlbnQnLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFdJVEggUkVDVVJTSVZFIGZvbGRlcl90cmVlIEFTIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIEFuY2hvcjogdGhlIFwiZDktcGx1bWJpbmctY29tbW9uXCIgZm9sZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBkaXJlY3R1c19mb2xkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgbmFtZSA9ICcke2NvbW1vbkZvbGRlck5hbWV9J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBSZWN1cnNpdmUgc3RlcDogZmluZCBzdWJmb2xkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIGYuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGRpcmVjdHVzX2ZvbGRlcnMgZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPSU4gZm9sZGVyX3RyZWUgZnQgT04gZi5wYXJlbnQgPSBmdC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgREVMRVRFIEZST00gcHVibGljLiR7Y29weVRhYmxlTmFtZX0gQVMgdFxuICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgdC4ke2ZvbGRlcktleVtub25QYXJzZWRUYWJsZU5hbWVdfSBJTiAoU0VMRUNUIGlkIEZST00gZm9sZGVyX3RyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk7XG4gICAgICAgICAgaWYgKG5vblBhcnNlZFRhYmxlTmFtZSA9PT0gJ2RpcmVjdHVzX2ZvbGRlcnMnKSB7XG4gICAgICAgICAgICBleGlzdGluZ1Jvd3NDYW5DYXVzZUNvbmZsaWN0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcGdDbGllbnQucXVlcnkoYERFTEVURSBGUk9NIHB1YmxpYy4ke2NvcHlUYWJsZU5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4aXN0aW5nUm93c0NhbkNhdXNlQ29uZmxpY3QpIHtcbiAgICAgICAgICAvL3dlIHdpbGwgaW1wb3J0IGRhdGEgaW4gYSB0ZW1wb3JhcnkgdGFibGUsIHRoZW4gZG8gdGhlIGluc2VydFxuICAgICAgICAgIGNvcHlUYWJsZU5hbWUgPSBwZy5lc2NhcGVJZGVudGlmaWVyKGAke25vblBhcnNlZFRhYmxlTmFtZX1fd2JjZV90bXBgKTtcbiAgICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICAgIGBDUkVBVEUgVEVNUCBUQUJMRSAke2NvcHlUYWJsZU5hbWV9IE9OIENPTU1JVCBEUk9QIEFTIFNFTEVDVCAqIEZST00gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9IFdJVEggTk8gREFUQWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgZmlyc3QgbGluZVxuICAgICAgICBsZXQgZmlyc3RMaW5lID0gYXdhaXQgcmVhZEZpcnN0TGluZU9mRmlsZShgLi9zcWwvZGF0YS8ke2ZpbGV9YCk7XG4gICAgICAgIGZpcnN0TGluZSA9IGZpcnN0TGluZVxuICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgLm1hcCgoYykgPT4gYFwiJHtjfVwiYClcbiAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICBjb25zdCBpbmdlc3RTdHJlYW0gPSBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICBjb3B5RnJvbShcbiAgICAgICAgICAgIGBDT1BZICR7Y29weVRhYmxlTmFtZX0gKCR7Zmlyc3RMaW5lfSkgIEZST00gU1RESU4gIERFTElNSVRFUiAnLCcgQ1NWIEhFQURFUmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc291cmNlU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShgLi9zcWwvZGF0YS8ke2ZpbGV9YCk7XG4gICAgICAgIGluZ2VzdFN0cmVhbS5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBpbmdlc3RlZCAke2ZpbGV9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2dnZXIuZGVidWcoYGluZ2VzdGluZyAke2ZpbGV9YCk7XG5cbiAgICAgICAgYXdhaXQgcGlwZWxpbmUoc291cmNlU3RyZWFtLCBpbmdlc3RTdHJlYW0pO1xuICAgICAgICBpZiAoZXhpc3RpbmdSb3dzQ2FuQ2F1c2VDb25mbGljdCkge1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcblx0XHRcdFx0XHRcdFx0REVMRVRFIEZST00gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9XG5cdFx0XHRcdFx0XHRcdFdIRVJFIGlkIElOIChTRUxFQ1QgaWQgRlJPTSAke2NvcHlUYWJsZU5hbWV9KTtcblx0XHRcdFx0XHRcdGApO1xuICAgICAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcblx0XHRcdFx0XHRcdFx0SU5TRVJUIElOVE8gcHVibGljLiR7b3JpZ2luYWxUYWJsZU5hbWV9XG5cdFx0XHRcdFx0XHRcdFNFTEVDVCAqIEZST00gJHtjb3B5VGFibGVOYW1lfTtcblx0XHRcdFx0XHRcdGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9yZWVzdGFibGlzaCB0aGUgY29uc3RyYWludHNcbiAgICBsb2dnZXIuaW5mbyhgUmVzdG9yaW5nICR7Y29uc3RyYWludHMucm93cy5sZW5ndGh9IGNvbnN0cmFpbnRzYCk7XG4gICAgZm9yIChjb25zdCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzLnJvd3MpIHtcbiAgICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBBTFRFUiBUQUJMRSAke2NvbnN0cmFpbnQubnNwbmFtZX0uXCIke2NvbnN0cmFpbnQucmVsbmFtZX1cIiBBREQgQ09OU1RSQUlOVCBcIiR7Y29uc3RyYWludC5jb25uYW1lfVwiICAke2NvbnN0cmFpbnQucGdfZ2V0X2NvbnN0cmFpbnRkZWZ9XG4gICAgICAgICAgICBgKTtcbiAgICB9XG5cbiAgICAvL3VwZGF0ZSB0aGUgc2VxdWVuY2VzXG4gICAgLy93aGVuIGFkZGluZyB3aXRoIENPUFksIGFsbCBzZXF1ZW5jZXMgYXJlIG5vdCB1cCB0byBkYXRlXG4gICAgLy93ZSBuZWVkIHRvIGZpbmQgYWxsIHNlcXVlbmNlcyBhbmQgdGhlbiB0byBmaW5kIHRoZSBtYXggb24gdGhlIG1hbmFnZWQgY29sdW1uIGFuZCB0aGVuIHRvIHVwZGF0ZSB0aGUgc2VxdWVuY2VcblxuICAgIGNvbnN0IHNlcXVlbmNlcyA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgIFNFTEVDVCBuLm5zcG5hbWUgYXMgXCJzY2hlbWFcIixcbiAgICAgICAgICAgICAgICBjLnJlbG5hbWUgYXMgXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgQ0FTRSBjLnJlbGtpbmQgV0hFTiAncicgVEhFTiAndGFibGUnIFdIRU4gJ3YnIFRIRU4gJ3ZpZXcnIFdIRU4gJ20nIFRIRU4gJ21hdGVyaWFsaXplZCB2aWV3JyBXSEVOICdpJyBUSEVOICdpbmRleCcgV0hFTiAnUycgVEhFTiAnc2VxdWVuY2UnIFdIRU4gJ3MnIFRIRU4gJ3NwZWNpYWwnIFdIRU4gJ3QnIFRIRU4gJ1RPQVNUIHRhYmxlJyBXSEVOICdmJyBUSEVOICdmb3JlaWduIHRhYmxlJyBXSEVOICdwJyBUSEVOICdwYXJ0aXRpb25lZCB0YWJsZScgV0hFTiAnSScgVEhFTiAncGFydGl0aW9uZWQgaW5kZXgnIEVORCBhcyBcIlR5cGVcIixcbiAgICAgICAgICAgICAgICBwZ19jYXRhbG9nLnBnX2dldF91c2VyYnlpZChjLnJlbG93bmVyKSBhcyBcIk93bmVyXCJcbiAgICAgICAgICAgIEZST00gcGdfY2F0YWxvZy5wZ19jbGFzcyBjXG4gICAgICAgICAgICAgICAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4gT04gbi5vaWQgPSBjLnJlbG5hbWVzcGFjZVxuICAgICAgICAgICAgV0hFUkUgYy5yZWxraW5kIElOICgnUycsJycpXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSA8PiAncGdfY2F0YWxvZydcbiAgICAgICAgICAgICAgICBBTkQgbi5uc3BuYW1lICF+ICdecGdfdG9hc3QnXG4gICAgICAgICAgICAgICAgQU5EIG4ubnNwbmFtZSA8PiAnaW5mb3JtYXRpb25fc2NoZW1hJ1xuICAgICAgICAgICAgQU5EIHBnX2NhdGFsb2cucGdfdGFibGVfaXNfdmlzaWJsZShjLm9pZClcbiAgICAgICAgICAgIE9SREVSIEJZIDEsMjtcbiAgICAgICAgYCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgUmVzZXR0aW5nICR7c2VxdWVuY2VzLnJvd3MubGVuZ3RofSBzZXF1ZW5jZXNgKTtcbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXF1ZW5jZXMucm93cykge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBmaW5kIGNvbHVtbiBtYW5hZ2VkIGJ5ICR7c2VxLm5hbWV9YCk7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBTRUxFQ1QgZC5yZWZvYmppZDo6cmVnY2xhc3MgYXMgXCJ0YWJsZVwiLCBhLmF0dG5hbWUgYXMgXCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgRlJPTSAgIHBnX2RlcGVuZCAgICBkXG4gICAgICAgICAgICAgICAgSk9JTiAgIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSBkLnJlZm9iamlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkQgYS5hdHRudW0gICA9IGQucmVmb2Jqc3ViaWRcbiAgICAgICAgICAgICAgICBXSEVSRSAgZC5vYmppZCA9ICcke3NlcS5zY2hlbWF9LlwiJHtzZXEubmFtZX1cIic6OnJlZ2NsYXNzXG4gICAgICAgICAgICAgICAgQU5EICAgIGQucmVmb2Jqc3ViaWQgPiAwXG4gICAgICAgICAgICAgICAgQU5EICAgIGQuY2xhc3NpZCA9ICdwZ19jbGFzcyc6OnJlZ2NsYXNzO1xuICAgICAgICAgICAgYCk7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBmaW5kIG1heCBvZiAke3JlbGF0aW9uLnJvd3NbMF0udGFibGV9ICR7cmVsYXRpb24ucm93c1swXS5maWVsZH1gLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1heCA9IGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KGBcbiAgICAgICAgICAgICAgICBTRUxFQ1QgTUFYKCR7cmVsYXRpb24ucm93c1swXS5maWVsZH0pXG4gICAgICAgICAgICAgICAgRlJPTSAke3JlbGF0aW9uLnJvd3NbMF0udGFibGV9XG4gICAgICAgICAgICBgKTtcblxuICAgICAgaWYgKG1heC5yb3dzWzBdLm1heCAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHJlc3RhcnQgJHtzZXEubmFtZX0gYXQgJHttYXgucm93c1swXS5tYXggKyAxfWApO1xuICAgICAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeShcbiAgICAgICAgICBgYWx0ZXIgc2VxdWVuY2UgJHtzZXEuc2NoZW1hfS5cIiR7c2VxLm5hbWV9XCIgcmVzdGFydCB3aXRoICR7bWF4LnJvd3NbMF0ubWF4ICsgMX07YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwZ0NsaWVudC5xdWVyeSgnQ09NTUlUJyk7XG4gICAgbG9nZ2VyLmluZm8oJ1RyYW5zYWN0aW9uIGNvbW1pdHRlZCcpO1xuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIGFwcGx5aW5nIHRoZSBzbmFwc2hvdCwgcm9sbGluZyBiYWNrIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIGF3YWl0IHBnQ2xpZW50LnF1ZXJ5KCdST0xMQkFDSycpO1xuXG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwZ0NsaWVudC5lbmQoKTtcbiAgICBhd2FpdCBwZ1RtcENsaWVudC5lbmQoKTtcbiAgfVxuICAvL3NjaGVtYSAoY29sbGVjdGlvbnMsIGZpZWxkcywgcmVsYXRpb25zKSBpcyBhbHdheXMgY2FjaGVkIChDQUNIRV9TQ0hFTUEpLCBwZXJtaXNzaW9ucyBvbmx5IHdoZW4gQ0FDSEVfRU5BQkxFRDogYSBwdXJnZSBpcyBlbm91Z2guXG4gIC8vZmxvd3MsIG9wZXJhdGlvbnMgYW5kIHdlYmhvb2tzIGFyZSBsb2FkZWQgaW4gbWVtb3J5IGF0IHN0YXJ0dXAgYW5kIG9ubHkgcmVsb2FkZWQgYnkgdGhlaXIgb3duIHNlcnZpY2VzOiBhIHJlc3RhcnQgaXMgbmVlZGVkLlxuICBsb2dnZXIud2FybignUHVyZ2UgdGhlIGQ5IGNhY2hlIChQT1NUIC91dGlscy9jYWNoZS9jbGVhcikgdG8gdGFrZSB0aGUgbmV3IHNjaGVtYSAoYW5kIHBlcm1pc3Npb25zLCBpZiBDQUNIRV9FTkFCTEVEKSBpbnRvIGFjY291bnQuIElmIGZsb3dzLCBvcGVyYXRpb25zIG9yIHdlYmhvb2tzIGNoYW5nZWQsIGFsc28gcmVzdGFydCBkOS4nKTtcbn1cblxuIl19
@@ -0,0 +1,9 @@
1
+ import { DbConfig } from './env';
2
+ /**
3
+ * Dumps the destination into a worktree checked out at `lastSave`, and fails if the dump differs from that commit.
4
+ */
5
+ export declare function checkUnsaved(opts: {
6
+ lastSave?: string | false;
7
+ yes: boolean;
8
+ db: DbConfig;
9
+ }): Promise<void>;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkUnsaved = checkUnsaved;
4
+ const promises_1 = require("fs/promises");
5
+ const path_1 = require("path");
6
+ const promises_2 = require("readline/promises");
7
+ const stream_1 = require("stream");
8
+ const cli_1 = require("./cli");
9
+ const save_snapshot_1 = require("./save-snapshot");
10
+ const logger_1 = require("../../logger");
11
+ const WORKTREE = 'node_modules/.cache/d9-plumbing/last-save';
12
+ function collect(onData) {
13
+ return new stream_1.Writable({
14
+ write: (chunk, _encoding, next) => {
15
+ onData(chunk.toString());
16
+ next();
17
+ },
18
+ });
19
+ }
20
+ async function confirm(yes) {
21
+ if (yes) {
22
+ return;
23
+ }
24
+ if (!process.stdin.isTTY) {
25
+ throw new Error('no TTY to confirm, use --yes to proceed');
26
+ }
27
+ const rl = (0, promises_2.createInterface)({ input: process.stdin, output: process.stdout });
28
+ try {
29
+ const answer = await rl.question('Are you sure? (y/N) ');
30
+ if (answer.trim().toLowerCase() !== 'y') {
31
+ throw new Error('aborted');
32
+ }
33
+ }
34
+ finally {
35
+ rl.close();
36
+ }
37
+ }
38
+ /**
39
+ * Dumps the destination into a worktree checked out at `lastSave`, and fails if the dump differs from that commit.
40
+ */
41
+ async function checkUnsaved(opts) {
42
+ if (opts.lastSave === undefined) {
43
+ throw new Error('--last-save <commit> is required (or --no-last-save to bypass the check)');
44
+ }
45
+ if (opts.lastSave === false) {
46
+ logger_1.logger.warn('Non saved updates may be erased in this environment. Are you sure ?');
47
+ await confirm(opts.yes);
48
+ return;
49
+ }
50
+ logger_1.logger.info(`Checking out the last save ${opts.lastSave} into a temporary worktree`);
51
+ const cli = new cli_1.Cli();
52
+ // the worktree holds the whole repository: the project lives at the same path inside it as in the current checkout
53
+ let prefix = '';
54
+ await cli.command('git', ['rev-parse', '--show-prefix'], { stdout: collect((data) => prefix += data) });
55
+ const projectInWorktree = (0, path_1.join)(WORKTREE, prefix.trim());
56
+ await (0, promises_1.rm)(WORKTREE, { recursive: true, force: true });
57
+ await cli.command('git', ['worktree', 'prune']);
58
+ await cli.command('git', ['worktree', 'add', '--detach', WORKTREE, opts.lastSave]);
59
+ let status = '';
60
+ const cwd = process.cwd();
61
+ try {
62
+ process.chdir(projectInWorktree);
63
+ logger_1.logger.info(`Dumping the current database to compare it with ${opts.lastSave}`);
64
+ await (0, save_snapshot_1.saveSQLSnapshot)(opts.db, { cedar: false });
65
+ process.chdir(cwd);
66
+ await cli.command('git', ['-C', projectInWorktree, 'status', '--porcelain', '--', 'sql'], {
67
+ stdout: collect((data) => status += data),
68
+ });
69
+ }
70
+ finally {
71
+ process.chdir(cwd);
72
+ await cli.command('git', ['worktree', 'remove', '--force', WORKTREE]);
73
+ }
74
+ if (status.trim()) {
75
+ logger_1.logger.error(`\n${status}`);
76
+ throw new Error('This environment has unsaved changes (see the files above). '
77
+ + 'Run `save` from this environment, commit, merge, then run `apply-schema` again.');
78
+ }
79
+ logger_1.logger.info(`No unsaved changes since ${opts.lastSave}`);
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stdW5zYXZlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvc2F2ZS9jaGVjay11bnNhdmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUNBLG9DQTJDQztBQXBGRCwwQ0FBaUM7QUFDakMsK0JBQTRCO0FBQzVCLGdEQUFvRDtBQUNwRCxtQ0FBa0M7QUFDbEMsK0JBQTRCO0FBRTVCLG1EQUFrRDtBQUNsRCx5Q0FBc0M7QUFFdEMsTUFBTSxRQUFRLEdBQUcsMkNBQTJDLENBQUM7QUFFN0QsU0FBUyxPQUFPLENBQUMsTUFBOEI7SUFDN0MsT0FBTyxJQUFJLGlCQUFRLENBQUM7UUFDbEIsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDekIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxPQUFPLENBQUMsR0FBWTtJQUNqQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELE1BQU0sRUFBRSxHQUFHLElBQUEsMEJBQWUsRUFBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxX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QztJQUVELElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEIsZUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQ7Y0FDNUQsaUZBQWlGLENBQ3BGLENBQUM7SUFDSixDQUFDO0lBQ0QsZUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJtIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJmYWNlIH0gZnJvbSAncmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQ2xpIH0gZnJvbSAnLi9jbGknO1xuaW1wb3J0IHsgRGJDb25maWcgfSBmcm9tICcuL2Vudic7XG5pbXBvcnQgeyBzYXZlU1FMU25hcHNob3QgfSBmcm9tICcuL3NhdmUtc25hcHNob3QnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nZ2VyJztcblxuY29uc3QgV09SS1RSRUUgPSAnbm9kZV9tb2R1bGVzLy5jYWNoZS9kOS1wbHVtYmluZy9sYXN0LXNhdmUnO1xuXG5mdW5jdGlvbiBjb2xsZWN0KG9uRGF0YTogKGRhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICB3cml0ZTogKGNodW5rLCBfZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIG9uRGF0YShjaHVuay50b1N0cmluZygpKTtcbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29uZmlybSh5ZXM6IGJvb2xlYW4pIHtcbiAgaWYgKHllcykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIFRUWSB0byBjb25maXJtLCB1c2UgLS15ZXMgdG8gcHJvY2VlZCcpO1xuICB9XG4gIGNvbnN0IHJsID0gY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcmwucXVlc3Rpb24oJ0FyZSB5b3Ugc3VyZT8gKHkvTikgJyk7XG4gICAgaWYgKGFuc3dlci50cmltKCkudG9Mb3dlckNhc2UoKSAhPT0gJ3knKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fib3J0ZWQnKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmwuY2xvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIER1bXBzIHRoZSBkZXN0aW5hdGlvbiBpbnRvIGEgd29ya3RyZWUgY2hlY2tlZCBvdXQgYXQgYGxhc3RTYXZlYCwgYW5kIGZhaWxzIGlmIHRoZSBkdW1wIGRpZmZlcnMgZnJvbSB0aGF0IGNvbW1pdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrVW5zYXZlZChvcHRzOiB7IGxhc3RTYXZlPzogc3RyaW5nIHwgZmFsc2U7IHllczogYm9vbGVhbjsgZGI6IERiQ29uZmlnIH0pIHtcbiAgaWYgKG9wdHMubGFzdFNhdmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignLS1sYXN0LXNhdmUgPGNvbW1pdD4gaXMgcmVxdWlyZWQgKG9yIC0tbm8tbGFzdC1zYXZlIHRvIGJ5cGFzcyB0aGUgY2hlY2spJyk7XG4gIH1cbiAgaWYgKG9wdHMubGFzdFNhdmUgPT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vbiBzYXZlZCB1cGRhdGVzIG1heSBiZSBlcmFzZWQgaW4gdGhpcyBlbnZpcm9ubWVudC4gQXJlIHlvdSBzdXJlID8nKTtcbiAgICBhd2FpdCBjb25maXJtKG9wdHMueWVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgQ2hlY2tpbmcgb3V0IHRoZSBsYXN0IHNhdmUgJHtvcHRzLmxhc3RTYXZlfSBpbnRvIGEgdGVtcG9yYXJ5IHdvcmt0cmVlYCk7XG4gIGNvbnN0IGNsaSA9IG5ldyBDbGkoKTtcbiAgLy8gdGhlIHdvcmt0cmVlIGhvbGRzIHRoZSB3aG9sZSByZXBvc2l0b3J5OiB0aGUgcHJvamVjdCBsaXZlcyBhdCB0aGUgc2FtZSBwYXRoIGluc2lkZSBpdCBhcyBpbiB0aGUgY3VycmVudCBjaGVja291dFxuICBsZXQgcHJlZml4ID0gJyc7XG4gIGF3YWl0IGNsaS5jb21tYW5kKCdnaXQnLCBbJ3Jldi1wYXJzZScsICctLXNob3ctcHJlZml4J10sIHsgc3Rkb3V0OiBjb2xsZWN0KChkYXRhKSA9PiBwcmVmaXggKz0gZGF0YSkgfSk7XG4gIGNvbnN0IHByb2plY3RJbldvcmt0cmVlID0gam9pbihXT1JLVFJFRSwgcHJlZml4LnRyaW0oKSk7XG4gIGF3YWl0IHJtKFdPUktUUkVFLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGF3YWl0IGNsaS5jb21tYW5kKCdnaXQnLCBbJ3dvcmt0cmVlJywgJ3BydW5lJ10pO1xuICBhd2FpdCBjbGkuY29tbWFuZCgnZ2l0JywgWyd3b3JrdHJlZScsICdhZGQnLCAnLS1kZXRhY2gnLCBXT1JLVFJFRSwgb3B0cy5sYXN0U2F2ZV0pO1xuXG4gIGxldCBzdGF0dXMgPSAnJztcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmNoZGlyKHByb2plY3RJbldvcmt0cmVlKTtcbiAgICBsb2dnZXIuaW5mbyhgRHVtcGluZyB0aGUgY3VycmVudCBkYXRhYmFzZSB0byBjb21wYXJlIGl0IHdpdGggJHtvcHRzLmxhc3RTYXZlfWApO1xuICAgIGF3YWl0IHNhdmVTUUxTbmFwc2hvdChvcHRzLmRiLCB7IGNlZGFyOiBmYWxzZSB9KTtcbiAgICBwcm9jZXNzLmNoZGlyKGN3ZCk7XG4gICAgYXdhaXQgY2xpLmNvbW1hbmQoJ2dpdCcsIFsnLUMnLCBwcm9qZWN0SW5Xb3JrdHJlZSwgJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctLScsICdzcWwnXSwge1xuICAgICAgc3Rkb3V0OiBjb2xsZWN0KChkYXRhKSA9PiBzdGF0dXMgKz0gZGF0YSksXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5jaGRpcihjd2QpO1xuICAgIGF3YWl0IGNsaS5jb21tYW5kKCdnaXQnLCBbJ3dvcmt0cmVlJywgJ3JlbW92ZScsICctLWZvcmNlJywgV09SS1RSRUVdKTtcbiAgfVxuXG4gIGlmIChzdGF0dXMudHJpbSgpKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBcXG4ke3N0YXR1c31gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVGhpcyBlbnZpcm9ubWVudCBoYXMgdW5zYXZlZCBjaGFuZ2VzIChzZWUgdGhlIGZpbGVzIGFib3ZlKS4gJ1xuICAgICAgKyAnUnVuIGBzYXZlYCBmcm9tIHRoaXMgZW52aXJvbm1lbnQsIGNvbW1pdCwgbWVyZ2UsIHRoZW4gcnVuIGBhcHBseS1zY2hlbWFgIGFnYWluLicsXG4gICAgKTtcbiAgfVxuICBsb2dnZXIuaW5mbyhgTm8gdW5zYXZlZCBjaGFuZ2VzIHNpbmNlICR7b3B0cy5sYXN0U2F2ZX1gKTtcbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import type { DriverConfig } from '@wbce-d9/storage';
2
+ export interface DbConfig {
3
+ host: string;
4
+ user: string;
5
+ pwd: string;
6
+ database: string;
7
+ ssl?: boolean;
8
+ }
9
+ export interface DbFlags {
10
+ host?: string;
11
+ user?: string;
12
+ password?: string;
13
+ database?: string;
14
+ ssl?: boolean;
15
+ }
16
+ export interface StorageFlags {
17
+ storageConfig?: string[];
18
+ intermediateStorageConfig?: string[];
19
+ files?: boolean;
20
+ }
21
+ export declare function resolveDbConfig(flags: DbFlags): Promise<DbConfig>;
22
+ export declare function resolveCurrentStorage(flags: StorageFlags): Promise<DriverConfig>;
23
+ /** The intermediate storage, or `undefined` when no driver is configured. */
24
+ export declare function findIntermediateStorage(flags: StorageFlags): Promise<DriverConfig | undefined>;
25
+ export declare function resolveIntermediateStorage(flags: StorageFlags): Promise<DriverConfig>;
26
+ /**
27
+ * The storages to sync files between, or `undefined` when the sync is disabled
28
+ * (`--no-files`, SKIP_FILE_SYNC) or no intermediate storage is configured.
29
+ */
30
+ export declare function resolveFileSync(flags: StorageFlags, direction: 'push' | 'pull'): Promise<{
31
+ origin: DriverConfig;
32
+ destination: DriverConfig;
33
+ } | undefined>;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDbConfig = resolveDbConfig;
4
+ exports.resolveCurrentStorage = resolveCurrentStorage;
5
+ exports.findIntermediateStorage = findIntermediateStorage;
6
+ exports.resolveIntermediateStorage = resolveIntermediateStorage;
7
+ exports.resolveFileSync = resolveFileSync;
8
+ const logger_1 = require("../../logger");
9
+ const plumbing_config_1 = require("../../plumbing-config");
10
+ // @wbce-d9/api is not a dependency of this package: it is resolved from the user's d9 project.
11
+ // Specifiers are kept in variables so tsc does not try to resolve them.
12
+ const envModule = '@wbce-d9/api/env';
13
+ const configFromEnvModule = '@wbce-d9/api/utils/get-config-from-env';
14
+ async function loadD9Env() {
15
+ const { getEnv } = (await Promise.resolve(`${envModule}`).then(s => require(s)));
16
+ const { getConfigFromEnv } = (await Promise.resolve(`${configFromEnvModule}`).then(s => require(s)));
17
+ return { env: getEnv(), getConfigFromEnv };
18
+ }
19
+ async function resolveDbConfig(flags) {
20
+ const { env, getConfigFromEnv } = await loadD9Env();
21
+ const config = {
22
+ host: flags.host ?? env.DB_HOST,
23
+ user: flags.user ?? env.DB_USER,
24
+ pwd: flags.password ?? env.DB_PASSWORD,
25
+ database: flags.database ?? env.DB_DATABASE,
26
+ // getConfigFromEnv also picks up nested DB_SSL__* keys (e.g. DB_SSL__REJECT_UNAUTHORIZED)
27
+ ssl: flags.ssl ?? Boolean(getConfigFromEnv('DB_').ssl),
28
+ };
29
+ const missing = Object.entries(config).filter(([, value]) => value === undefined).map(([key]) => key);
30
+ if (missing.length > 0) {
31
+ throw new Error(`missing database configuration: ${missing.join(', ')} (use flags or DB_* environment variables)`);
32
+ }
33
+ return config;
34
+ }
35
+ function toDriverConfig({ driver, ...options }) {
36
+ return { driver, options };
37
+ }
38
+ async function resolveCurrentStorage(flags) {
39
+ const { env, getConfigFromEnv } = await loadD9Env();
40
+ const location = String(env.STORAGE_LOCATIONS ?? '').split(',')[0].trim();
41
+ const config = location ? getConfigFromEnv(`STORAGE_${location.toUpperCase()}_`) : {};
42
+ applyConfigFlags(config, '--storage-config', flags.storageConfig);
43
+ if (!config.driver) {
44
+ throw new Error('no storage driver found (use STORAGE_LOCATIONS and STORAGE_<LOCATION>_DRIVER or --storage-config driver=...)');
45
+ }
46
+ return toDriverConfig(config);
47
+ }
48
+ function setPath(target, path, value) {
49
+ const keys = path.split('.');
50
+ const last = keys.pop();
51
+ let current = target;
52
+ for (const key of keys) {
53
+ current[key] = current[key] ?? {};
54
+ current = current[key];
55
+ }
56
+ current[last] = value;
57
+ }
58
+ function applyConfigFlags(config, flag, entries = []) {
59
+ for (const entry of entries) {
60
+ const separator = entry.indexOf('=');
61
+ if (separator === -1) {
62
+ throw new Error(`invalid ${flag} "${entry}", expected key=value`);
63
+ }
64
+ setPath(config, entry.slice(0, separator), entry.slice(separator + 1));
65
+ }
66
+ }
67
+ /** The intermediate storage, or `undefined` when no driver is configured. */
68
+ async function findIntermediateStorage(flags) {
69
+ const { env, getConfigFromEnv } = await loadD9Env();
70
+ let config = {};
71
+ const file = (0, plumbing_config_1.readPlumbingConfig)().intermediateStorage;
72
+ if (file) {
73
+ config = { driver: file.driver, ...file.options };
74
+ for (const [key, envName] of Object.entries(file.secretEnv ?? {})) {
75
+ config[key] = env[envName];
76
+ }
77
+ }
78
+ config = { ...config, ...getConfigFromEnv('INTERMEDIATE_STORAGE_') };
79
+ applyConfigFlags(config, '--intermediate-storage-config', flags.intermediateStorageConfig);
80
+ return config.driver ? toDriverConfig(config) : undefined;
81
+ }
82
+ async function resolveIntermediateStorage(flags) {
83
+ const config = await findIntermediateStorage(flags);
84
+ if (!config) {
85
+ throw new Error(`no intermediate storage driver found (use intermediateStorage in ${plumbing_config_1.PLUMBING_CONFIG_FILE}, INTERMEDIATE_STORAGE_DRIVER or --intermediate-storage-config driver=...)`);
86
+ }
87
+ return config;
88
+ }
89
+ /**
90
+ * The storages to sync files between, or `undefined` when the sync is disabled
91
+ * (`--no-files`, SKIP_FILE_SYNC) or no intermediate storage is configured.
92
+ */
93
+ async function resolveFileSync(flags, direction) {
94
+ const { env } = await loadD9Env();
95
+ if (flags.files === false || env.SKIP_FILE_SYNC === true || env.SKIP_FILE_SYNC === 'true') {
96
+ logger_1.logger.info('File sync disabled, skipping it');
97
+ return undefined;
98
+ }
99
+ const intermediate = await findIntermediateStorage(flags);
100
+ if (!intermediate) {
101
+ logger_1.logger.info('No intermediate storage configured, skipping the file sync');
102
+ return undefined;
103
+ }
104
+ const current = await resolveCurrentStorage(flags);
105
+ return direction === 'push'
106
+ ? { origin: current, destination: intermediate }
107
+ : { origin: intermediate, destination: current };
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9jb21tYW5kcy9zYXZlL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVDQSwwQ0FlQztBQU1ELHNEQVNDO0FBd0JELDBEQWlCQztBQUVELGdFQU1DO0FBTUQsMENBZUM7QUExSUQseUNBQXNDO0FBQ3RDLDJEQUFpRjtBQXdCakYsK0ZBQStGO0FBQy9GLHdFQUF3RTtBQUN4RSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBRXJFLEtBQUssVUFBVSxTQUFTO0lBQ3RCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLHlCQUFhLFNBQVMseUJBQUMsQ0FBMEMsQ0FBQztJQUN0RixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLHlCQUFhLG1CQUFtQix5QkFBQyxDQUU5RCxDQUFDO0lBQ0YsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDbEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUc7UUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTztRQUMvQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTztRQUMvQixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsV0FBVztRQUN0QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsV0FBVztRQUMzQywwRkFBMEY7UUFDMUYsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFD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QUFLLENBQUMsb0VBQW9FLHNDQUFvQiw0RUFBNEUsQ0FBQyxDQUFDO0lBQ3hMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLGVBQWUsQ0FBQyxLQUFtQixFQUFFLFNBQTBCO0lBQ25GLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLGNBQWMsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUMxRixlQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDL0MsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLE1BQU0sdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLGVBQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUMxRSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxPQUFPLFNBQVMsS0FBSyxNQUFNO1FBQ3pCLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRTtRQUNoRCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEcml2ZXJDb25maWcgfSBmcm9tICdAd2JjZS1kOS9zdG9yYWdlJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBQTFVNQklOR19DT05GSUdfRklMRSwgcmVhZFBsdW1iaW5nQ29uZmlnIH0gZnJvbSAnLi4vLi4vcGx1bWJpbmctY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBEYkNvbmZpZyB7XG4gIGhvc3Q6IHN0cmluZztcbiAgdXNlcjogc3RyaW5nO1xuICBwd2Q6IHN0cmluZztcbiAgZGF0YWJhc2U6IHN0cmluZztcbiAgc3NsPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYkZsYWdzIHtcbiAgaG9zdD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIGRhdGFiYXNlPzogc3RyaW5nO1xuICBzc2w/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VGbGFncyB7XG4gIHN0b3JhZ2VDb25maWc/OiBzdHJpbmdbXTtcbiAgaW50ZXJtZWRpYXRlU3RvcmFnZUNvbmZpZz86IHN0cmluZ1tdO1xuICBmaWxlcz86IGJvb2xlYW47XG59XG5cbi8vIEB3YmNlLWQ5L2FwaSBpcyBub3QgYSBkZXBlbmRlbmN5IG9mIHRoaXMgcGFja2FnZTogaXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgdXNlcidzIGQ5IHByb2plY3QuXG4vLyBTcGVjaWZpZXJzIGFyZSBrZXB0IGluIHZhcmlhYmxlcyBzbyB0c2MgZG9lcyBub3QgdHJ5IHRvIHJlc29sdmUgdGhlbS5cbmNvbnN0IGVudk1vZHVsZSA9ICdAd2JjZS1kOS9hcGkvZW52JztcbmNvbnN0IGNvbmZpZ0Zyb21FbnZNb2R1bGUgPSAnQHdiY2UtZDkvYXBpL3V0aWxzL2dldC1jb25maWctZnJvbS1lbnYnO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkRDlFbnYoKSB7XG4gIGNvbnN0IHsgZ2V0RW52IH0gPSAoYXdhaXQgaW1wb3J0KGVudk1vZHVsZSkpIGFzIHsgZ2V0RW52OiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIGNvbnN0IHsgZ2V0Q29uZmlnRnJvbUVudiB9ID0gKGF3YWl0IGltcG9ydChjb25maWdGcm9tRW52TW9kdWxlKSkgYXMge1xuICAgIGdldENvbmZpZ0Zyb21FbnY6IChwcmVmaXg6IHN0cmluZykgPT4gUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfTtcbiAgcmV0dXJuIHsgZW52OiBnZXRFbnYoKSwgZ2V0Q29uZmlnRnJvbUVudiB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURiQ29uZmlnKGZsYWdzOiBEYkZsYWdzKTogUHJvbWlzZTxEYkNvbmZpZz4ge1xuICBjb25zdCB7IGVudiwgZ2V0Q29uZmlnRnJvbUVudiB9ID0gYXdhaXQgbG9hZEQ5RW52KCk7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBob3N0OiBmbGFncy5ob3N0ID8/IGVudi5EQl9IT1NULFxuICAgIHVzZXI6IGZsYWdzLnVzZXIgPz8gZW52LkRCX1VTRVIsXG4gICAgcHdkOiBmbGFncy5wYXNzd29yZCA/PyBlbnYuREJfUEFTU1dPUkQsXG4gICAgZGF0YWJhc2U6IGZsYWdzLmRhdGFiYXNlID8/IGVudi5EQl9EQVRBQkFTRSxcbiAgICAvLyBnZXRDb25maWdGcm9tRW52IGFsc28gcGlja3MgdXAgbmVzdGVkIERCX1NTTF9fKiBrZXlzIChlLmcuIERCX1NTTF9fUkVKRUNUX1VOQVVUSE9SSVpFRClcbiAgICBzc2w6IGZsYWdzLnNzbCA/PyBCb29sZWFuKGdldENvbmZpZ0Zyb21FbnYoJ0RCXycpLnNzbCksXG4gIH07XG4gIGNvbnN0IG1pc3NpbmcgPSBPYmplY3QuZW50cmllcyhjb25maWcpLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSA9PT0gdW5kZWZpbmVkKS5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb246ICR7bWlzc2luZy5qb2luKCcsICcpfSAodXNlIGZsYWdzIG9yIERCXyogZW52aXJvbm1lbnQgdmFyaWFibGVzKWApO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIHRvRHJpdmVyQ29uZmlnKHsgZHJpdmVyLCAuLi5vcHRpb25zIH06IFJlY29yZDxzdHJpbmcsIGFueT4pOiBEcml2ZXJDb25maWcge1xuICByZXR1cm4geyBkcml2ZXIsIG9wdGlvbnMgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDdXJyZW50U3RvcmFnZShmbGFnczogU3RvcmFnZUZsYWdzKTogUHJvbWlzZTxEcml2ZXJDb25maWc+IHtcbiAgY29uc3QgeyBlbnYsIGdldENvbmZpZ0Zyb21FbnYgfSA9IGF3YWl0IGxvYWREOUVudigpO1xuICBjb25zdCBsb2NhdGlvbiA9IFN0cmluZyhlbnYuU1RPUkFHRV9MT0NBVElPTlMgPz8gJycpLnNwbGl0KCcsJylbMF0udHJpbSgpO1xuICBjb25zdCBjb25maWcgPSBsb2NhdGlvbiA/IGdldENvbmZpZ0Zyb21FbnYoYFNUT1JBR0VfJHtsb2NhdGlvbi50b1VwcGVyQ2FzZSgpfV9gKSA6IHt9O1xuICBhcHBseUNvbmZpZ0ZsYWdzKGNvbmZpZywgJy0tc3RvcmFnZS1jb25maWcnLCBmbGFncy5zdG9yYWdlQ29uZmlnKTtcbiAgaWYgKCFjb25maWcuZHJpdmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdubyBzdG9yYWdlIGRyaXZlciBmb3VuZCAodXNlIFNUT1JBR0VfTE9DQVRJT05TIGFuZCBTVE9SQUdFXzxMT0NBVElPTj5fRFJJVkVSIG9yIC0tc3RvcmFnZS1jb25maWcgZHJpdmVyPS4uLiknKTtcbiAgfVxuICByZXR1cm4gdG9Ecml2ZXJDb25maWcoY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gc2V0UGF0aCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICBjb25zdCBsYXN0ID0ga2V5cy5wb3AoKSE7XG4gIGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY3VycmVudFtrZXldID0gY3VycmVudFtrZXldID8/IHt9O1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgY3VycmVudFtsYXN0XSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBhcHBseUNvbmZpZ0ZsYWdzKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiwgZmxhZzogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmdbXSA9IFtdKSB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IGVudHJ5LmluZGV4T2YoJz0nKTtcbiAgICBpZiAoc2VwYXJhdG9yID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkICR7ZmxhZ30gXCIke2VudHJ5fVwiLCBleHBlY3RlZCBrZXk9dmFsdWVgKTtcbiAgICB9XG4gICAgc2V0UGF0aChjb25maWcsIGVudHJ5LnNsaWNlKDAsIHNlcGFyYXRvciksIGVudHJ5LnNsaWNlKHNlcGFyYXRvciArIDEpKTtcbiAgfVxufVxuXG4vKiogVGhlIGludGVybWVkaWF0ZSBzdG9yYWdlLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIGRyaXZlciBpcyBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRJbnRlcm1lZGlhdGVTdG9yYWdlKGZsYWdzOiBTdG9yYWdlRmxhZ3MpOiBQcm9taXNlPERyaXZlckNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGVudiwgZ2V0Q29uZmlnRnJvbUVudiB9ID0gYXdhaXQgbG9hZEQ5RW52KCk7XG4gIGxldCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBjb25zdCBmaWxlID0gcmVhZFBsdW1iaW5nQ29uZmlnKCkuaW50ZXJtZWRpYXRlU3RvcmFnZTtcbiAgaWYgKGZpbGUpIHtcbiAgICBjb25maWcgPSB7IGRyaXZlcjogZmlsZS5kcml2ZXIsIC4uLmZpbGUub3B0aW9ucyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZW52TmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsZS5zZWNyZXRFbnYgPz8ge30pKSB7XG4gICAgICBjb25maWdba2V5XSA9IGVudltlbnZOYW1lXTtcbiAgICB9XG4gIH1cblxuICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q29uZmlnRnJvbUVudignSU5URVJNRURJQVRFX1NUT1JBR0VfJykgfTtcblxuICBhcHBseUNvbmZpZ0ZsYWdzKGNvbmZpZywgJy0taW50ZXJtZWRpYXRlLXN0b3JhZ2UtY29uZmlnJywgZmxhZ3MuaW50ZXJtZWRpYXRlU3RvcmFnZUNvbmZpZyk7XG5cbiAgcmV0dXJuIGNvbmZpZy5kcml2ZXIgPyB0b0RyaXZlckNvbmZpZyhjb25maWcpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUludGVybWVkaWF0ZVN0b3JhZ2UoZmxhZ3M6IFN0b3JhZ2VGbGFncyk6IFByb21pc2U8RHJpdmVyQ29uZmlnPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGZpbmRJbnRlcm1lZGlhdGVTdG9yYWdlKGZsYWdzKTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGludGVybWVkaWF0ZSBzdG9yYWdlIGRyaXZlciBmb3VuZCAodXNlIGludGVybWVkaWF0ZVN0b3JhZ2UgaW4gJHtQTFVNQklOR19DT05GSUdfRklMRX0sIElOVEVSTUVESUFURV9TVE9SQUdFX0RSSVZFUiBvciAtLWludGVybWVkaWF0ZS1zdG9yYWdlLWNvbmZpZyBkcml2ZXI9Li4uKWApO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbi8qKlxuICogVGhlIHN0b3JhZ2VzIHRvIHN5bmMgZmlsZXMgYmV0d2Vlbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3luYyBpcyBkaXNhYmxlZFxuICogKGAtLW5vLWZpbGVzYCwgU0tJUF9GSUxFX1NZTkMpIG9yIG5vIGludGVybWVkaWF0ZSBzdG9yYWdlIGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZVN5bmMoZmxhZ3M6IFN0b3JhZ2VGbGFncywgZGlyZWN0aW9uOiAncHVzaCcgfCAncHVsbCcpOiBQcm9taXNlPHsgb3JpZ2luOiBEcml2ZXJDb25maWc7IGRlc3RpbmF0aW9uOiBEcml2ZXJDb25maWcgfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IGVudiB9ID0gYXdhaXQgbG9hZEQ5RW52KCk7XG4gIGlmIChmbGFncy5maWxlcyA9PT0gZmFsc2UgfHwgZW52LlNLSVBfRklMRV9TWU5DID09PSB0cnVlIHx8IGVudi5TS0lQX0ZJTEVfU1lOQyA9PT0gJ3RydWUnKSB7XG4gICAgbG9nZ2VyLmluZm8oJ0ZpbGUgc3luYyBkaXNhYmxlZCwgc2tpcHBpbmcgaXQnKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGludGVybWVkaWF0ZSA9IGF3YWl0IGZpbmRJbnRlcm1lZGlhdGVTdG9yYWdlKGZsYWdzKTtcbiAgaWYgKCFpbnRlcm1lZGlhdGUpIHtcbiAgICBsb2dnZXIuaW5mbygnTm8gaW50ZXJtZWRpYXRlIHN0b3JhZ2UgY29uZmlndXJlZCwgc2tpcHBpbmcgdGhlIGZpbGUgc3luYycpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IHJlc29sdmVDdXJyZW50U3RvcmFnZShmbGFncyk7XG4gIHJldHVybiBkaXJlY3Rpb24gPT09ICdwdXNoJ1xuICAgID8geyBvcmlnaW46IGN1cnJlbnQsIGRlc3RpbmF0aW9uOiBpbnRlcm1lZGlhdGUgfVxuICAgIDogeyBvcmlnaW46IGludGVybWVkaWF0ZSwgZGVzdGluYXRpb246IGN1cnJlbnQgfTtcbn1cbiJdfQ==