sonamu 0.10.12 → 0.10.13

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 (513) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +131 -27
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +12 -6
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
@@ -1,11 +1,12 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
- import { Sonamu, init_sonamu } from "../api/sonamu.js";
2
+ import { init_runtime_value, isObjectValue, isStringValue } from "../utils/runtime-value.js";
3
3
  import { BUILT_IN_TYPE_IDS, SonamuFileArraySchema, SonamuFileSchema, init_types, isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isSearchTextProp, isStringArrayProp, isStringSingleProp, isTsVectorProp, isUuidArrayProp, isUuidSingleProp, isVectorArrayProp, isVectorSingleProp, isVirtualProp } from "../types/types.js";
4
+ import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
5
  import { createImportUrl, init_esm_utils } from "../utils/esm-utils.js";
5
6
  import { init_path_utils, runtimePath } from "../utils/path-utils.js";
6
7
  import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
7
8
  import inflection from "inflection";
8
- import { z as z$1 } from "zod";
9
+ import { z } from "zod";
9
10
  import path from "path";
10
11
  //#region src/template/zod-converter.ts
11
12
  /**
@@ -35,22 +36,18 @@ function getBuiltInSchemaName(zodType) {
35
36
  * Zod 4에서는 z.email(), z.uuid() 등 독립적인 함수 형태를 사용합니다.
36
37
  */
37
38
  function zodFormatToCode(format) {
38
- const isoFormats = {
39
- isoDate: "z.iso.date()",
40
- isoTime: "z.iso.time()",
41
- isoDatetime: "z.iso.datetime()",
42
- isoDuration: "z.iso.duration()"
43
- };
44
- const hashFormats = {
45
- hashMd5: "z.hash(\"md5\")",
46
- hashSha1: "z.hash(\"sha1\")",
47
- hashSha256: "z.hash(\"sha256\")",
48
- hashSha384: "z.hash(\"sha384\")",
49
- hashSha512: "z.hash(\"sha512\")"
50
- };
51
- if (format in isoFormats) return isoFormats[format];
52
- if (format in hashFormats) return hashFormats[format];
53
- return `z.${format}()`;
39
+ switch (format) {
40
+ case "isoDate": return "z.iso.date()";
41
+ case "isoTime": return "z.iso.time()";
42
+ case "isoDatetime": return "z.iso.datetime()";
43
+ case "isoDuration": return "z.iso.duration()";
44
+ case "hashMd5": return "z.hash(\"md5\")";
45
+ case "hashSha1": return "z.hash(\"sha1\")";
46
+ case "hashSha256": return "z.hash(\"sha256\")";
47
+ case "hashSha384": return "z.hash(\"sha384\")";
48
+ case "hashSha512": return "z.hash(\"sha512\")";
49
+ default: return `z.${format}()`;
50
+ }
54
51
  }
55
52
  /**
56
53
  * zodFormat을 Zod 4 타입으로 변환합니다.
@@ -58,16 +55,34 @@ function zodFormatToCode(format) {
58
55
  */
59
56
  function zodFormatToType(format) {
60
57
  switch (format) {
61
- case "isoDate": return z$1.iso.date();
62
- case "isoTime": return z$1.iso.time();
63
- case "isoDatetime": return z$1.iso.datetime();
64
- case "isoDuration": return z$1.iso.duration();
65
- case "hashMd5": return z$1.hash("md5");
66
- case "hashSha1": return z$1.hash("sha1");
67
- case "hashSha256": return z$1.hash("sha256");
68
- case "hashSha384": return z$1.hash("sha384");
69
- case "hashSha512": return z$1.hash("sha512");
70
- default: return z$1[format]();
58
+ case "email": return z.email();
59
+ case "uuid": return z.uuid();
60
+ case "url": return z.url();
61
+ case "httpUrl": return z.httpUrl();
62
+ case "hostname": return z.hostname();
63
+ case "emoji": return z.emoji();
64
+ case "base64": return z.base64();
65
+ case "base64url": return z.base64url();
66
+ case "hex": return z.hex();
67
+ case "jwt": return z.jwt();
68
+ case "nanoid": return z.nanoid();
69
+ case "cuid": return z.cuid();
70
+ case "cuid2": return z.cuid2();
71
+ case "ulid": return z.ulid();
72
+ case "ipv4": return z.ipv4();
73
+ case "ipv6": return z.ipv6();
74
+ case "mac": return z.mac();
75
+ case "cidrv4": return z.cidrv4();
76
+ case "cidrv6": return z.cidrv6();
77
+ case "isoDate": return z.iso.date();
78
+ case "isoTime": return z.iso.time();
79
+ case "isoDatetime": return z.iso.datetime();
80
+ case "isoDuration": return z.iso.duration();
81
+ case "hashMd5": return z.hash("md5");
82
+ case "hashSha1": return z.hash("sha1");
83
+ case "hashSha256": return z.hash("sha256");
84
+ case "hashSha384": return z.hash("sha384");
85
+ case "hashSha512": return z.hash("sha512");
71
86
  }
72
87
  }
73
88
  /**
@@ -91,46 +106,46 @@ async function getZodTypeById(zodTypeId) {
91
106
  * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
92
107
  */
93
108
  async function propToZodType(prop) {
94
- let zodType = z$1.unknown();
95
- if (isIntegerSingleProp(prop)) zodType = z$1.number().int();
96
- else if (isIntegerArrayProp(prop)) zodType = z$1.number().int().array();
97
- else if (isBigIntegerSingleProp(prop)) zodType = z$1.bigint();
98
- else if (isBigIntegerArrayProp(prop)) zodType = z$1.bigint().array();
109
+ let zodType = z.unknown();
110
+ if (isIntegerSingleProp(prop)) zodType = z.number().int();
111
+ else if (isIntegerArrayProp(prop)) zodType = z.number().int().array();
112
+ else if (isBigIntegerSingleProp(prop)) zodType = z.bigint();
113
+ else if (isBigIntegerArrayProp(prop)) zodType = z.bigint().array();
99
114
  else if (isEnumSingleProp(prop)) zodType = await getZodTypeById(prop.id);
100
115
  else if (isEnumArrayProp(prop)) zodType = (await getZodTypeById(prop.id)).array();
101
116
  else if (isStringSingleProp(prop)) if (prop.zodFormat) {
102
117
  zodType = zodFormatToType(prop.zodFormat);
103
118
  if (prop.length && "max" in zodType) zodType = zodType.max(prop.length);
104
- } else if (prop.length) zodType = z$1.string().max(prop.length);
105
- else zodType = z$1.string();
119
+ } else if (prop.length) zodType = z.string().max(prop.length);
120
+ else zodType = z.string();
106
121
  else if (isStringArrayProp(prop)) {
107
122
  let elementType;
108
123
  if (prop.zodFormat) {
109
124
  elementType = zodFormatToType(prop.zodFormat);
110
125
  if (prop.length && "max" in elementType) elementType = elementType.max(prop.length);
111
- } else if (prop.length) elementType = z$1.string().max(prop.length);
112
- else elementType = z$1.string();
126
+ } else if (prop.length) elementType = z.string().max(prop.length);
127
+ else elementType = z.string();
113
128
  zodType = elementType.array();
114
- } else if (isNumberSingleProp(prop)) zodType = z$1.number();
115
- else if (isNumberArrayProp(prop)) zodType = z$1.number().array();
116
- else if (isNumericSingleProp(prop)) zodType = z$1.string();
117
- else if (isNumericArrayProp(prop)) zodType = z$1.string().array();
118
- else if (isBooleanSingleProp(prop)) zodType = z$1.boolean();
119
- else if (isBooleanArrayProp(prop)) zodType = z$1.boolean().array();
120
- else if (isDateSingleProp(prop)) zodType = z$1.date();
121
- else if (isDateArrayProp(prop)) zodType = z$1.date().array();
122
- else if (isUuidSingleProp(prop)) zodType = z$1.uuid();
123
- else if (isUuidArrayProp(prop)) zodType = z$1.uuid().array();
129
+ } else if (isNumberSingleProp(prop)) zodType = z.number();
130
+ else if (isNumberArrayProp(prop)) zodType = z.number().array();
131
+ else if (isNumericSingleProp(prop)) zodType = z.string();
132
+ else if (isNumericArrayProp(prop)) zodType = z.string().array();
133
+ else if (isBooleanSingleProp(prop)) zodType = z.boolean();
134
+ else if (isBooleanArrayProp(prop)) zodType = z.boolean().array();
135
+ else if (isDateSingleProp(prop)) zodType = z.date();
136
+ else if (isDateArrayProp(prop)) zodType = z.date().array();
137
+ else if (isUuidSingleProp(prop)) zodType = z.uuid();
138
+ else if (isUuidArrayProp(prop)) zodType = z.uuid().array();
124
139
  else if (isJsonProp(prop)) zodType = await getZodTypeById(prop.id);
125
- else if (isSearchTextProp(prop)) zodType = z$1.string();
126
- else if (isVectorSingleProp(prop)) zodType = z$1.array(z$1.number());
127
- else if (isVectorArrayProp(prop)) zodType = z$1.array(z$1.array(z$1.number()));
140
+ else if (isSearchTextProp(prop)) zodType = z.string();
141
+ else if (isVectorSingleProp(prop)) zodType = z.array(z.number());
142
+ else if (isVectorArrayProp(prop)) zodType = z.array(z.array(z.number()));
128
143
  else if (isVirtualProp(prop)) zodType = await getZodTypeById(prop.id);
129
144
  else if (isRelationProp(prop)) {
130
145
  if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
131
146
  const pkType = EntityManager.get(prop.with).getPkType();
132
- if (pkType === "string" || pkType === "uuid") zodType = z$1.string();
133
- else zodType = z$1.number().int();
147
+ if (pkType === "string" || pkType === "uuid") zodType = z.string();
148
+ else zodType = z.number().int();
134
149
  }
135
150
  } else throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
136
151
  if (prop.unsigned) zodType = zodType.nonnegative();
@@ -241,7 +256,7 @@ function zodTypeToTsTypeDef(zt) {
241
256
  return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
242
257
  }
243
258
  case "literal": return Array.from(zt.values).map((value) => {
244
- if (typeof value === "string") return `"${value}"`;
259
+ if (isStringValue(value)) return `"${value}"`;
245
260
  if (value === null) return `null`;
246
261
  if (value === void 0) return `undefined`;
247
262
  return `${value}`;
@@ -250,12 +265,12 @@ function zodTypeToTsTypeDef(zt) {
250
265
  case "enum": return `${zt.options.map((val) => `"${val}"`).join(" | ")}`;
251
266
  case "array": return `${zodTypeToTsTypeDef(zt.element)}[]`;
252
267
  case "object": {
253
- const shape = zt.shape;
268
+ const objectFields = zt["shape"];
254
269
  return [
255
270
  "{",
256
- ...Object.keys(shape).map((key) => {
257
- if (shape[key].def.type === "optional") return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
258
- else return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
271
+ ...Object.keys(objectFields).map((key) => {
272
+ if (objectFields[key].def.type === "optional") return `${key}?: ${zodTypeToTsTypeDef(objectFields[key].def.innerType)},`;
273
+ else return `${key}: ${zodTypeToTsTypeDef(objectFields[key])},`;
259
274
  }),
260
275
  "}"
261
276
  ].join("\n");
@@ -265,8 +280,8 @@ function zodTypeToTsTypeDef(zt) {
265
280
  const def = zt.def;
266
281
  if (!def.parts || def.parts.length === 0) return "string";
267
282
  return `\`${def.parts.map((part) => {
268
- if (typeof part === "string") return `${part}`;
269
- if (part && typeof part === "object" && part._zod) return `$\{${zodTypeToTsTypeDef(part)}}`;
283
+ if (isStringValue(part)) return `${part}`;
284
+ if (part && isObjectValue(part) && part instanceof z.ZodType) return `$\{${zodTypeToTsTypeDef(part)}}`;
270
285
  return `\${string}`;
271
286
  }).join("")}\``;
272
287
  }
@@ -305,7 +320,7 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
305
320
  }
306
321
  case "literal": {
307
322
  const items = Array.from(zt.values).map((value) => {
308
- if (typeof value === "string") return `"${value}"`;
323
+ if (isStringValue(value)) return `"${value}"`;
309
324
  if (value === null) return `null`;
310
325
  if (value === void 0) return `undefined`;
311
326
  return `${value}`;
@@ -314,13 +329,13 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
314
329
  return `z.literal([${items.join(", ")}])`;
315
330
  }
316
331
  case "union": return `z.union([${zt.def.options.map((option) => zodTypeToZodCode(option, injectImportKeys)).join(",")}])`;
317
- case "enum": return `z.enum({${Object.entries(zt.def.entries).map(([key, val]) => typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
332
+ case "enum": return `z.enum({${Object.entries(zt.def.entries).map(([key, val]) => isStringValue(val) ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
318
333
  case "array": return `z.array(${zodTypeToZodCode(zt.def.element, injectImportKeys)})`;
319
334
  case "object": {
320
- const shape = zt.shape;
335
+ const objectFields = zt["shape"];
321
336
  return [
322
337
  "z.object({",
323
- ...Object.keys(shape).map((key) => `${key}: ${zodTypeToZodCode(shape[key], injectImportKeys)},`),
338
+ ...Object.keys(objectFields).map((key) => `${key}: ${zodTypeToZodCode(objectFields[key], injectImportKeys)},`),
324
339
  "})"
325
340
  ].join("\n");
326
341
  }
@@ -330,8 +345,8 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
330
345
  const def = zt.def;
331
346
  if (!def.parts || def.parts.length === 0) return "z.templateLiteral([])";
332
347
  return `z.templateLiteral([${def.parts.map((part) => {
333
- if (typeof part === "string") return `"${part}"`;
334
- if (part && typeof part === "object" && part._zod) return zodTypeToZodCode(part, injectImportKeys);
348
+ if (isStringValue(part)) return `"${part}"`;
349
+ if (part && isObjectValue(part) && part instanceof z.ZodType) return zodTypeToZodCode(part, injectImportKeys);
335
350
  return "z.string()";
336
351
  }).join(", ")}])`;
337
352
  }
@@ -374,9 +389,9 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
374
389
  ...def,
375
390
  renderType: "json-sonamufile"
376
391
  };
377
- if (zodType instanceof z$1.ZodObject) {
378
- const children = Object.keys(zodType.shape).map((key) => {
379
- const innerType = zodType.shape[key];
392
+ if (zodType instanceof z.ZodObject) {
393
+ const children = Object.keys(zodType["shape"]).map((key) => {
394
+ const innerType = zodType["shape"][key];
380
395
  return zodTypeToRenderingNode(innerType, key);
381
396
  });
382
397
  return {
@@ -384,9 +399,9 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
384
399
  renderType: "object",
385
400
  children
386
401
  };
387
- } else if (zodType instanceof z$1.ZodArray) {
402
+ } else if (zodType instanceof z.ZodArray) {
388
403
  const innerType = zodType.def.element;
389
- if (innerType instanceof z$1.ZodNumber && (baseKey.includes("embedding") || baseKey.includes("vector"))) return {
404
+ if (innerType instanceof z.ZodNumber && (baseKey.includes("embedding") || baseKey.includes("vector"))) return {
390
405
  ...def,
391
406
  renderType: "vector"
392
407
  };
@@ -395,12 +410,12 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
395
410
  renderType: "array",
396
411
  element: zodTypeToRenderingNode(innerType, baseKey)
397
412
  };
398
- } else if (zodType instanceof z$1.ZodUnion) return zodType.def.options.map((opt) => zodTypeToRenderingNode(opt, baseKey))[0];
399
- else if (zodType instanceof z$1.ZodOptional) return {
413
+ } else if (zodType instanceof z.ZodUnion) return zodType.def.options.map((opt) => zodTypeToRenderingNode(opt, baseKey))[0];
414
+ else if (zodType instanceof z.ZodOptional) return {
400
415
  ...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
401
416
  optional: true
402
417
  };
403
- else if (zodType instanceof z$1.ZodNullable) return {
418
+ else if (zodType instanceof z.ZodNullable) return {
404
419
  ...zodTypeToRenderingNode(zodType.def.innerType, baseKey),
405
420
  nullable: true
406
421
  };
@@ -413,22 +428,22 @@ function zodTypeToRenderingNode(zodType, baseKey = "root") {
413
428
  * Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
414
429
  */
415
430
  function resolveRenderType(key, zodType) {
416
- if (zodType instanceof z$1.ZodDate) return "datetime";
417
- else if (zodType instanceof z$1.core.$ZodString) if (zodType.description === "SQLDateTimeString") return "string-datetime";
431
+ if (zodType instanceof z.ZodDate) return "datetime";
432
+ else if (zodType instanceof z.core.$ZodString) if (zodType.description === "SQLDateTimeString") return "string-datetime";
418
433
  else if (key.endsWith("date")) return "string-date";
419
434
  else if (key === "id") return "string-id";
420
435
  else if (key.endsWith("_id")) return "string-fk_id";
421
436
  else return "string-plain";
422
- else if (zodType instanceof z$1.ZodNumber) if (key === "id") return "number-id";
437
+ else if (zodType instanceof z.ZodNumber) if (key === "id") return "number-id";
423
438
  else if (key.endsWith("_id")) return "number-fk_id";
424
439
  else return "number-plain";
425
- else if (zodType instanceof z$1.ZodBoolean) return "boolean";
426
- else if (zodType instanceof z$1.ZodEnum) return "enums";
427
- else if (zodType instanceof z$1.ZodRecord) return "record";
428
- else if (zodType instanceof z$1.ZodAny || zodType instanceof z$1.ZodUnknown) return "string-plain";
429
- else if (zodType instanceof z$1.ZodUnion) return "string-plain";
430
- else if (zodType instanceof z$1.ZodLiteral) return "string-plain";
431
- else if (zodType instanceof z$1.ZodTemplateLiteral) return "string-plain";
440
+ else if (zodType instanceof z.ZodBoolean) return "boolean";
441
+ else if (zodType instanceof z.ZodEnum) return "enums";
442
+ else if (zodType instanceof z.ZodRecord) return "record";
443
+ else if (zodType instanceof z.ZodAny || zodType instanceof z.ZodUnknown) return "string-plain";
444
+ else if (zodType instanceof z.ZodUnion) return "string-plain";
445
+ else if (zodType instanceof z.ZodLiteral) return "string-plain";
446
+ else if (zodType instanceof z.ZodTemplateLiteral) return "string-plain";
432
447
  else if (zodType.def.type === "custom") return "object";
433
448
  else throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
434
449
  }
@@ -439,6 +454,7 @@ var init_zod_converter = __esmMin((() => {
439
454
  init_types();
440
455
  init_esm_utils();
441
456
  init_path_utils();
457
+ init_runtime_value();
442
458
  BUILT_IN_TYPES = {
443
459
  SonamuFile: {
444
460
  schema: SonamuFileSchema,
@@ -456,4 +472,4 @@ var init_zod_converter = __esmMin((() => {
456
472
  init_zod_converter();
457
473
  export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
458
474
 
459
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbInoiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHpvZC1jb252ZXJ0ZXIg6rWs7ISxXG4gKiAxLiDsnKDti7jrpqzti7BcbiAqICAtIGdldFpvZFR5cGVCeUlkXG4gKlxuICogMi4gWm9kIO2DgOyehSDrs4DtmZggKEVudGl0eVByb3AgLT4gWm9kVHlwZSlcbiAqICAtIHByb3BUb1pvZFR5cGVcbiAqXG4gKiAzLiBFbnRpdHlQcm9wL05vZGUgLT4gWm9kIOy9lOuTnCDrrLjsnpDsl7RcbiAqICAtIHByb3BUb1pvZFR5cGVEZWZcbiAqICAtIHByb3BOb2RlVG9ab2RUeXBlRGVmXG4gKlxuICogNC4gWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBab2RDb2RlKVxuICogIC0gem9kVHlwZVRvWm9kQ29kZVxuICpcbiAqIDUuIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmYIChab2RUeXBlIC0+IFJlbmRlcmluZ05vZGUpXG4gKiAgLSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlXG4gKiAgLSByZXNvbHZlUmVuZGVyVHlwZVxuICovXG5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEJVSUxUX0lOX1RZUEVfSURTLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0JpZ0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0Jvb2xlYW5BcnJheVByb3AsXG4gIGlzQm9vbGVhblNpbmdsZVByb3AsXG4gIGlzRGF0ZUFycmF5UHJvcCxcbiAgaXNEYXRlU2luZ2xlUHJvcCxcbiAgaXNFbnVtQXJyYXlQcm9wLFxuICBpc0VudW1TaW5nbGVQcm9wLFxuICBpc0ludGVnZXJBcnJheVByb3AsXG4gIGlzSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzTnVtYmVyQXJyYXlQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY0FycmF5UHJvcCxcbiAgaXNOdW1lcmljU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzU2VhcmNoVGV4dFByb3AsXG4gIGlzU3RyaW5nQXJyYXlQcm9wLFxuICBpc1N0cmluZ1NpbmdsZVByb3AsXG4gIGlzVHNWZWN0b3JQcm9wLFxuICBpc1V1aWRBcnJheVByb3AsXG4gIGlzVXVpZFNpbmdsZVByb3AsXG4gIGlzVmVjdG9yQXJyYXlQcm9wLFxuICBpc1ZlY3RvclNpbmdsZVByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgU29uYW11RmlsZVNjaGVtYSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIHR5cGUgUmVuZGVyaW5nTm9kZSxcbiAgdHlwZSBab2RTdHJpbmdGb3JtYXQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICAvLyBJU08g7Y+s66e37J2AIHouaXNvLnh4eCgpIO2Yle2DnFxuICBjb25zdCBpc29Gb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlzb0RhdGU6IFwiei5pc28uZGF0ZSgpXCIsXG4gICAgaXNvVGltZTogXCJ6Lmlzby50aW1lKClcIixcbiAgICBpc29EYXRldGltZTogXCJ6Lmlzby5kYXRldGltZSgpXCIsXG4gICAgaXNvRHVyYXRpb246IFwiei5pc28uZHVyYXRpb24oKVwiLFxuICB9O1xuXG4gIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgY29uc3QgaGFzaEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgaGFzaE1kNTogJ3ouaGFzaChcIm1kNVwiKScsXG4gICAgaGFzaFNoYTE6ICd6Lmhhc2goXCJzaGExXCIpJyxcbiAgICBoYXNoU2hhMjU2OiAnei5oYXNoKFwic2hhMjU2XCIpJyxcbiAgICBoYXNoU2hhMzg0OiAnei5oYXNoKFwic2hhMzg0XCIpJyxcbiAgICBoYXNoU2hhNTEyOiAnei5oYXNoKFwic2hhNTEyXCIpJyxcbiAgfTtcblxuICBpZiAoZm9ybWF0IGluIGlzb0Zvcm1hdHMpIHtcbiAgICByZXR1cm4gaXNvRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaWYgKGZvcm1hdCBpbiBoYXNoRm9ybWF0cykge1xuICAgIHJldHVybiBoYXNoRm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgLy8g6riw67O4IO2PrOunt+ydgCB6Lnh4eCgpIO2Yle2DnCAoWm9kIDQpXG4gIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBab2QgNOyXkOyEnOuKlCB6LmVtYWlsKCksIHoudXVpZCgpIOuTsSDrj4Xrpr3soIHsnbgg7ZWo7IiYIO2Yle2DnOulvCDsgqzsmqntlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHpvZEZvcm1hdFRvVHlwZShmb3JtYXQ6IFpvZFN0cmluZ0Zvcm1hdCk6IHouWm9kVHlwZSB7XG4gIC8vIElTTyDtj6zrp7fsnYAgei5pc28ueHh4KCkg7ZiV7YOcXG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIC8vIGhhc2gg7Y+s66e37J2AIHouaGFzaChcImFsZ29yaXRobVwiKSDtmJXtg5xcbiAgICBjYXNlIFwiaGFzaE1kNVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcIm1kNVwiKTtcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGExXCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMjU2XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMjU2XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMzg0XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhMzg0XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwic2hhNTEyXCIpO1xuICAgIC8vIOq4sOuzuCDtj6zrp7fsnYAgei54eHgoKSDtmJXtg5wgKFpvZCA0KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHogYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB6LlpvZFR5cGU+KVtmb3JtYXRdKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoKEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh6b2RUeXBlSWQpKSB7XG4gICAgY29uc3QgYnVpbHRJblR5cGUgPSBCVUlMVF9JTl9UWVBFU1t6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXTtcbiAgICBpZiAoIWJ1aWx0SW5UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuCtOyepSDtg4DsnoUgJHt6b2RUeXBlSWR97J2YIOyKpO2CpOuniOqwgCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBidWlsdEluVHlwZS5zY2hlbWEuZGVzY3JpYmUoem9kVHlwZUlkKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOygne2KuOyXkOyEnCDsoJXsnZjtlZwg7YOA7J6FIOuPmeyggSDroZzrk5xcbiAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aCh6b2RUeXBlSWQpO1xuICBjb25zdCBtb2R1bGVBYnNQYXRoID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke21vZHVsZVBhdGh9LmpzYCksXG4gICk7XG4gIGNvbnN0IGltcG9ydFVybCA9IGNyZWF0ZUltcG9ydFVybChtb2R1bGVBYnNQYXRoKTtcbiAgY29uc3QgaW1wb3J0ZWQgPSBhd2FpdCBpbXBvcnQoaW1wb3J0VXJsKTtcblxuICBpZiAoIWltcG9ydGVkW3pvZFR5cGVJZF0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgem9kVHlwZUlkICR7em9kVHlwZUlkfWApO1xuICB9XG4gIHJldHVybiBpbXBvcnRlZFt6b2RUeXBlSWRdLmRlc2NyaWJlKHpvZFR5cGVJZCk7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJpZ2ludCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gKGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgem9kVHlwZSA9IHpvZEZvcm1hdFRvVHlwZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGggJiYgXCJtYXhcIiBpbiB6b2RUeXBlKSB7XG4gICAgICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZFN0cmluZykubWF4KHByb3AubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdBcnJheVByb3AocHJvcCkpIHtcbiAgICBsZXQgZWxlbWVudFR5cGU6IHouWm9kVHlwZTtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gKGVsZW1lbnRUeXBlIGFzIHouWm9kU3RyaW5nKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZSA9IHouc3RyaW5nKCk7XG4gICAgfVxuICAgIHpvZFR5cGUgPSBlbGVtZW50VHlwZS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU2VhcmNoVGV4dFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5hcnJheSh6Lm51bWJlcigpKTtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHouYXJyYXkoei5udW1iZXIoKSkpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksg7YOA7J6F7J2EIOywuOyhsCDsl5Tti7Dti7AgUEsg7YOA7J6F7JeQIOuUsOudvCDqsrDsoJVcbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICBjb25zdCBwa1R5cGUgPSByZWxFbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgICBpZiAocGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwcm9w7J2EIHpvZFR5cGXsnLzroZwg67OA7ZmY7ZWY64qU642wIOyLpO2MqCAke3Byb3B9fWApO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgem9kVHlwZSA9ICh6b2RUeXBlIGFzIHouWm9kTnVtYmVyKS5ub25uZWdhdGl2ZSgpO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgem9kVHlwZSA9IHpvZFR5cGUubnVsbGFibGUoKTtcbiAgfVxuXG4gIHJldHVybiB6b2RUeXBlO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlRGVmKHByb3A6IEVudGl0eVByb3AsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgbGV0IHN0bXQ6IHN0cmluZztcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKWA7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouaW50KCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5iaWdpbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc0VudW1BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfS5hcnJheSgpYDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgY29uc3QgYmFzZSA9IHpvZEZvcm1hdFRvQ29kZShwcm9wLnpvZEZvcm1hdCk7XG4gICAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0ubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9LmFycmF5KClgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSkuYXJyYXkoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5udW1iZXIoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKClgO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpYDtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKWA7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICAvLyDrgrTsnqUg7YOA7J6F7J24IOqyveyasCDsiqTtgqTrp4gg7J2066aE7Jy866GcIOuzgO2ZmFxuICAgIGlmICgoQlVJTFRfSU5fVFlQRV9JRFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHByb3AuaWQpKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKChwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH0pLnVuc2lnbmVkKSB7XG4gICAgc3RtdCArPSBcIi5ub25uZWdhdGl2ZSgpXCI7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICBzdG10ICs9IFwiLm51bGxhYmxlKClcIjtcbiAgfVxuXG4gIC8vIG51bWVyaWMg7YOA7J6F7J2YIOqyveyasCBudWxsYWJsZSDsnbTtm4Tsl5AgbWV0YSDstpTqsIAgKOuplO2DgOuNsOydtO2EsOqwgCDstZzsg4HsnIQg66CI67Ko7JeQIOyeiOyWtOyVvCDtlagpXG4gIGlmIChpc051bWVyaWNTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgKz0gJy5tZXRhKHsgU29uYW11UHJvcFR5cGU6IFwibnVtZXJpY1wiIH0pJztcbiAgfVxuXG4gIHJldHVybiBgJHtzdG10fSxgO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoUg7KCV7J2YIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg64W465OcIO2DgOyeheydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWY7JesIOykkeyyqSDqtazsobDrpbwg7KeA7JuQ7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJwbGFpblwiKSB7XG4gICAgcmV0dXJuIHByb3BUb1pvZFR5cGVEZWYocHJvcE5vZGUucHJvcCwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInouYXJyYXkoei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIFwifSkpLFwiLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9wTm9kZS5wcm9wID8gYCR7cHJvcE5vZGUucHJvcC5uYW1lfTogYCA6IFwiXCIsXG4gICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBgfSkke3Byb3BOb2RlLnByb3A/Lm51bGxhYmxlID8gXCIubnVsbGFibGUoKVwiIDogXCJcIn0sYCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1RzVHlwZURlZih6dDogei5ab2RUeXBlKTogc3RyaW5nIHtcbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcIkRhdGVcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0gfCBudWxsYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgcmV0dXJuIHpvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmLmlubmVyVHlwZSk7XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCByZWNvcmRUeXBlID0genQgYXMgQW55Wm9kUmVjb3JkO1xuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke3pvZFR5cGVUb1RzVHlwZURlZihyZWNvcmRUeXBlLmRlZi5rZXlUeXBlKX0gXTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKX19YDtcbiAgICB9XG4gICAgY2FzZSBcImxpdGVyYWxcIjpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKCh6dCBhcyB6LlpvZExpdGVyYWwpLnZhbHVlcylcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYG51bGxgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYHVuZGVmaW5lZGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiIHwgXCIpO1xuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyBBbnlab2RVbmlvbikub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb24pID0+IHpvZFR5cGVUb1RzVHlwZURlZihvcHRpb24pKVxuICAgICAgICAuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7KHp0IGFzIHouWm9kRW51bSkub3B0aW9ucy5tYXAoKHZhbCkgPT4gYFwiJHt2YWx9XCJgKS5qb2luKFwiIHwgXCIpfWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoc2hhcGVba2V5XS5kZWYudHlwZSA9PT0gXCJvcHRpb25hbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fT86ICR7em9kVHlwZVRvVHNUeXBlRGVmKHNoYXBlW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFs7J2AIHN0cmluZ+ycvOuhnCDtj7TrsLFcbiAgICAgIGlmICghZGVmLnBhcnRzIHx8IGRlZi5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIOqwgSBwYXJ066W8IFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrpqzthLDrn7Qg6rCSIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgdHlwZW9mIHBhcnQgPT09IFwib2JqZWN0XCIgJiYgKHBhcnQgYXMgei5ab2RUeXBlKS5fem9kKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1aWx0SW5TY2hlbWFOYW1lID0gZ2V0QnVpbHRJblNjaGVtYU5hbWUoenQpO1xuICBpZiAoYnVpbHRJblNjaGVtYU5hbWUpIHtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goYnVpbHRJblNjaGVtYU5hbWUpO1xuICAgIHJldHVybiBidWlsdEluU2NoZW1hTmFtZTtcbiAgfVxuXG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgoenQgYXMgQW55Wm9kTnVsbGFibGUpLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5udWxsYWJsZSgpYDtcbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICBjb25zdCB6RGVmYXVsdERlZiA9ICh6dCBhcyBBbnlab2REZWZhdWx0KS5kZWY7XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSh6RGVmYXVsdERlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5kZWZhdWx0KCR7ekRlZmF1bHREZWYuZGVmYXVsdFZhbHVlfSlgO1xuICAgIH1cbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHpSZWNvcmREZWYgPSAoenQgYXMgQW55Wm9kUmVjb3JkKS5kZWY7XG4gICAgICByZXR1cm4gYHoucmVjb3JkKCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUsIGluamVjdEltcG9ydEtleXMpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj4pLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7KHp0IGFzIEFueVpvZFVuaW9uKS5kZWYub3B0aW9uc1xuICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24sIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9XSlgO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAvLyBOT1RFOiB6LmVudW0oW1wiQVwiLCBcIkJcIl0p64+EIHouZW51bSh7IEE6IFwiQVwiLCBCOiBcIkJcIiB9KeuhnCDsspjrpqzrkKguXG4gICAgICByZXR1cm4gYHouZW51bSh7JHtPYmplY3QuZW50cmllcygoenQgYXMgei5ab2RFbnVtKS5kZWYuZW50cmllcylcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJHtrZXl9OiBcIiR7dmFsfVwiYCA6IGAke2tleX06ICR7dmFsfWApKVxuICAgICAgICAuam9pbihcIiwgXCIpfX0pYDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgei5hcnJheSgke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgc2hhcGUgPSAoenQgYXMgQW55Wm9kT2JqZWN0KS5zaGFwZTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhzaGFwZSkubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShzaGFwZVtrZXldLCBpbmplY3RJbXBvcnRLZXlzKX0sYCxcbiAgICAgICAgKSxcbiAgICAgICAgXCJ9KVwiLFxuICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjYXNlIFwib3B0aW9uYWxcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gYFwiJHtwYXJ0fVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBab2RUeXBlIC0g7J6s6reA7KCB7Jy866GcIOuzgO2ZmFxuICAgICAgICBpZiAocGFydCAmJiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiAocGFydCBhcyB6LlpvZFR5cGUpLl96b2QpIHtcbiAgICAgICAgICByZXR1cm4gem9kVHlwZVRvWm9kQ29kZShwYXJ0IGFzIHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgei50ZW1wbGF0ZUxpdGVyYWwoWyR7cGFydHMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICBjb25zdCB6SW50ZXJzZWN0aW9uRGVmID0gKHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmO1xuICAgICAgcmV0dXJuIGB6LmludGVyc2VjdGlvbigke3pvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgIHpJbnRlcnNlY3Rpb25EZWYubGVmdCxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9LCAke3pvZFR5cGVUb1pvZENvZGUoekludGVyc2VjdGlvbkRlZi5yaWdodCwgaW5qZWN0SW1wb3J0S2V5cyl9KWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsnqzqt4DsoIHsnLzroZwg7KSR7LKp65CcIO2DgOyeheuTpOydhCDsspjrpqztlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKFxuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnksXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiLFxuKTogUmVuZGVyaW5nTm9kZSB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICBuYW1lOiBiYXNlS2V5LFxuICAgIGxhYmVsOiBpbmZsZWN0aW9uLmNhbWVsaXplKGJhc2VLZXksIGZhbHNlKSxcbiAgICB6b2RUeXBlLFxuICB9O1xuXG4gIC8qKlxuICAgKiDsvIDsnbTsiqQg7LKY66asIOyInOyEnFxuICAgKlxuICAgKiAxLiDtirnsiJgg7LyA7J207IqkIChkZXNjcmlwdGlvbiDquLDrsJgpXG4gICAqICAgIC0gU29uYW11RmlsZS9Tb25hbXVGaWxlW10gOiB6Lm9iamVjdC96LmFycmF57J207KeA66eMIO2MjOydvCDsl4XroZzrk5zsmqkg64K07J6lIO2DgOyehVxuICAgKlxuICAgKiAyLiDsnbzrsJgg7LyA7J207IqkIChpbnN0YW5jZW9mIOq4sOuwmClcbiAgICogICAgLSB6LlpvZE9iamVjdCA6IOydvOuwmCDqsJ3ssrRcbiAgICogICAgLSB6LlpvZEFycmF5IDog7J2867CYIOuwsOyXtFxuICAgKiAgICAgIC0gdmVjdG9yIDogei5hcnJheSh6Lm51bWJlcinsnbTsp4Drp4wg64Sk7J2067CNIOq4sOuwmOycvOuhnCDrsqHthLAg7J6E67Kg65SpXG4gICAqICAgICAgLSDsnbzrsJgg67Cw7Je0IDog6re4IOyZuFxuICAgKiAgICAtIHouWm9kVW5pb24sIHouWm9kT3B0aW9uYWwsIHouWm9kTnVsbGFibGUgOiDsnKDti7jrpqzti7Ag7YOA7J6FXG4gICAqICAgIC0g6riw7YOAIDogcmVzb2x2ZVJlbmRlclR5cGUoKeycvOuhnCDsspjrpqxcbiAgICovXG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZVtdIO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlLWFycmF5XCIgfTtcbiAgfVxuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGUg64uo7J28IO2DgOyehSDqsJDsp4BcbiAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU29uYW11RmlsZVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZVwiIH07XG4gIH1cblxuICAvLyDsnbzrsJgg7LyA7J207IqkOiBab2RPYmplY3Qg7LK07YGsXG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+KS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID0gKHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT4pLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PlxuICAgICAgem9kVHlwZVRvUmVuZGVyaW5nTm9kZShvcHQsIGJhc2VLZXkpLFxuICAgICk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdWxsYWJsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi56b2RUeXBlVG9SZW5kZXJpbmdOb2RlKCh6b2RUeXBlIGFzIHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZBLFNBQVMscUJBQXFCLFNBQXdDO0NBRXBFLE9BRGdCLE9BQU8sUUFBUSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxRQUFRLGdCQUFnQixNQUNuRixDQUFBLEdBQVUsRUFBRSxDQUFDO0FBQ3RCOzs7OztBQU1BLFNBQVMsZ0JBQWdCLFFBQWlDO0NBRXhELE1BQU0sYUFBcUM7RUFDekMsU0FBUztFQUNULFNBQVM7RUFDVCxhQUFhO0VBQ2IsYUFBYTtDQUNmO0NBR0EsTUFBTSxjQUFzQztFQUMxQyxTQUFTO0VBQ1QsVUFBVTtFQUNWLFlBQVk7RUFDWixZQUFZO0VBQ1osWUFBWTtDQUNkO0NBRUEsSUFBSSxVQUFVLFlBQ1osT0FBTyxXQUFXO0NBR3BCLElBQUksVUFBVSxhQUNaLE9BQU8sWUFBWTtDQUlyQixPQUFPLEtBQUssT0FB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
475
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsXG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kVW5pb25cbiAgICAgICAgKS5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgICAuam9pbihcIiB8IFwiKVxuICAgICAgfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RmllbGRzW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKG9iamVjdEZpZWxkc1trZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWUgPSBnZXRCdWlsdEluU2NoZW1hTmFtZSh6dCk7XG4gIGlmIChidWlsdEluU2NoZW1hTmFtZSkge1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChidWlsdEluU2NoZW1hTmFtZSk7XG4gICAgcmV0dXJuIGJ1aWx0SW5TY2hlbWFOYW1lO1xuICB9XG5cbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2REZWZhdWx0XG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kUmVjb3JkXG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFske1xuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2RVbmlvblxuICAgICAgICApLmRlZi5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIixcIilcbiAgICAgIH1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKFxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEVudW1cbiAgICAgICAgKS5kZWYuZW50cmllcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKGlzU3RyaW5nVmFsdWUodmFsKSA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUob2JqZWN0RmllbGRzW2tleV0sIGluamVjdEltcG9ydEtleXMpfSxgLFxuICAgICAgICApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShwYXJ0KSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgekludGVyc2VjdGlvbkRlZi5sZWZ0LFxuICAgICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICAgKX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlW1wic2hhcGVcIl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVtcInNoYXBlXCJdW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PlxuICAgICAgKS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+XG4gICAgICApLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSkpO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThGQSxTQUFTLHFCQUFxQixTQUF3QztDQUVwRSxPQURnQixPQUFPLFFBQVEsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsTUFDbkYsQ0FBQSxHQUFVLEVBQUUsQ0FBQztBQUN0Qjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFpQztDQUN4RCxRQUFRLFFBQVI7RUFDRSxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxlQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxTQUNFLE9BQU8sS0FBSyxPQUFPO0NBQ3ZCO0FBQ0Y7Ozs7O0FBTUEsU0FBUyxnQkFBZ0IsUUFBb0M7Q0FDM0QsUUFBUSxRQUFSO0VBQ0UsS0FBSyxTQUNILE9BQU8sRUFBRSxNQUFNO0VBQ2pCLEtBQUssUUFDSCxPQUFPLEVBQUUsS0FBSztFQUNoQixLQUFLLE9BQ0gsT0FBTyxFQUFFLElBQUk7RUFDZixLQUFLLFdBQ0gsT0FBTyxFQUFFLFFBQVE7RUFDbkIsS0FBSyxZQUNILE9BQU8sRUFBRSxTQUFTO0VBQ3BCLEtBQUssU0FDSCxPQUFPLEVBQUUsTUFBTTtFQUNqQixLQUFLLFVBQ0gsT0FBTyxFQUFFLE9BQU87RUFDbEIsS0FBSyxhQUNILE9BQU8sRUFBRSxVQUFVO0VBQ3JCLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssVUFDSCxP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
@@ -1 +1 @@
1
- {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,gBAAgB,CAAC;AASvE,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA+C3C,iBAAiB,IAAI,MAAM,EAAE;CAyD9B"}
1
+ {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,gBAAgB,CAAC;AASvE,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IAkD3C,iBAAiB,IAAI,MAAM,EAAE;CAyD9B"}