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,3 +1,4 @@
1
+ import { type EventEmitter } from "node:events";
1
2
  import { type WebSocket } from "ws";
2
3
  import { z } from "zod";
3
4
  import { type WebSocketAudience } from "./ws-audience";
@@ -7,11 +8,16 @@ import { type ManagedWebSocketConnection, WebSocketRegistry, type WebSocketRoomI
7
8
  import { type WebSocketTelemetryConnectionContext, type WebSocketTelemetryController, type WebSocketTelemetryOptions } from "./ws-telemetry";
8
9
  type MessageHandler<T> = (data: T, telemetryContext?: WebSocketTelemetryConnectionContext) => void | Promise<void>;
9
10
  type CloseHandler = () => void | Promise<void>;
10
- export type WebSocketEventMap = Record<string, unknown>;
11
- type InferWebSocketEventMap<TSchema extends z.ZodRawShape> = z.infer<z.ZodObject<TSchema>>;
12
- export type WebSocketOutEvents<TOut extends WebSocketEventMap = WebSocketEventMap> = TOut;
13
- export type WebSocketInEvents<TIn extends WebSocketEventMap = WebSocketEventMap> = TIn;
14
- export interface WebSocketConnection<TOut extends WebSocketEventMap = WebSocketEventMap, TIn extends WebSocketEventMap = WebSocketEventMap> extends ManagedWebSocketConnection {
11
+ export type WebSocketEventMap<EventPayload = never> = Record<string, EventPayload>;
12
+ export type WebSocketTransport = Pick<WebSocket, "bufferedAmount" | "close" | "ping" | "readyState" | "send" | "terminate"> & {
13
+ off: (...args: Parameters<EventEmitter["off"]>) => void;
14
+ on: (...args: Parameters<EventEmitter["on"]>) => void;
15
+ };
16
+ type WebSocketEventFields = Record<string, z.ZodType>;
17
+ type InferWebSocketEventMap<TSchema extends WebSocketEventFields> = z.infer<z.ZodObject<TSchema>>;
18
+ export type WebSocketOutEvents<TOut extends object = WebSocketEventMap> = TOut;
19
+ export type WebSocketInEvents<TIn extends object = WebSocketEventMap> = TIn;
20
+ export interface WebSocketConnection<TOut extends object = WebSocketEventMap, TIn extends object = WebSocketEventMap> extends ManagedWebSocketConnection {
15
21
  transport: "ws";
16
22
  onClose(callback: CloseHandler): void;
17
23
  onMessage<K extends keyof WebSocketInEvents<TIn>>(event: K, handler: MessageHandler<WebSocketInEvents<TIn>[K]>): void;
@@ -22,8 +28,8 @@ export interface WebSocketConnection<TOut extends WebSocketEventMap = WebSocketE
22
28
  setUserId(userId: WebSocketUserId): void;
23
29
  clearUserId(): void;
24
30
  }
25
- export type AnyWebSocketConnection = WebSocketConnection<WebSocketEventMap, WebSocketEventMap>;
26
- type WebSocketConnectionOptions<TOut extends z.ZodRawShape, TIn extends z.ZodRawShape> = {
31
+ export type AnyWebSocketConnection = WebSocketConnection<object, object>;
32
+ type WebSocketConnectionOptions<TOut extends WebSocketEventFields, TIn extends WebSocketEventFields> = {
27
33
  namespace?: string;
28
34
  heartbeat?: number;
29
35
  active?: boolean;
@@ -46,12 +52,12 @@ export declare class WebSocketRuntime {
46
52
  readonly registry: WebSocketRegistry;
47
53
  readonly telemetryController: WebSocketTelemetryController;
48
54
  constructor(options?: WebSocketRuntimeOptions);
49
- registerConnection<TOutSchema extends z.ZodRawShape, TInSchema extends z.ZodRawShape>(socket: WebSocket, options: Omit<WebSocketConnectionOptions<TOutSchema, TInSchema>, "registry" | "telemetryController">): WebSocketConnection<InferWebSocketEventMap<TOutSchema>, InferWebSocketEventMap<TInSchema>>;
55
+ registerConnection<TOutSchema extends WebSocketEventFields, TInSchema extends WebSocketEventFields>(socket: WebSocketTransport, options: Omit<WebSocketConnectionOptions<TOutSchema, TInSchema>, "registry" | "telemetryController">): WebSocketConnection<InferWebSocketEventMap<TOutSchema>, InferWebSocketEventMap<TInSchema>>;
50
56
  activateConnection(connectionId: string): void;
51
- broadcast(event: string, data: unknown, namespace?: string): void;
52
- publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void;
53
- publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void;
54
- publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void;
57
+ broadcast<Data>(event: string, data: Data, namespace?: string): void;
58
+ publishToRoom<Data>(roomId: WebSocketRoomId, event: string, data: Data, namespace?: string): void;
59
+ publishToUser<Data>(userId: WebSocketUserId, event: string, data: Data, namespace?: string): void;
60
+ publishToAudience<Data>(audience: WebSocketAudience, event: string, data: Data): void;
55
61
  shutdown(code?: number, reason?: string): Promise<void>;
56
62
  }
57
63
  export declare function createWebSocketRuntime(options?: WebSocketRuntimeOptions): WebSocketRuntime;
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/stream/ws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/stream/ws.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,KAAK,0BAA0B,EAC/B,iBAAiB,EAEjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,mCAAmC,EACxC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAI/B,MAAM,gBAAgB,CAAC;AAgCxB,KAAK,cAAc,CAAC,CAAC,IAAI,CACvB,IAAI,EAAE,CAAC,EACP,gBAAgB,CAAC,EAAE,mCAAmC,KACnD,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1B,KAAK,YAAY,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/C,MAAM,MAAM,iBAAiB,CAAC,YAAY,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACnF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,SAAS,EACT,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,CAC1E,GAAG;IACF,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;IACxD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;CACvD,CAAC;AAEF,KAAK,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,KAAK,sBAAsB,CAAC,OAAO,SAAS,oBAAoB,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAElG,MAAM,MAAM,kBAAkB,CAAC,IAAI,SAAS,MAAM,GAAG,iBAAiB,IAAI,IAAI,CAAC;AAE/E,MAAM,MAAM,iBAAiB,CAAC,GAAG,SAAS,MAAM,GAAG,iBAAiB,IAAI,GAAG,CAAC;AAE5E,MAAM,WAAW,mBAAmB,CAClC,IAAI,SAAS,MAAM,GAAG,iBAAiB,EACvC,GAAG,SAAS,MAAM,GAAG,iBAAiB,CACtC,SAAQ,0BAA0B;IAClC,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,CAAC,SAAS,MAAM,iBAAiB,CAAC,GAAG,CAAC,EAC9C,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GACjD,IAAI,CAAC;IACR,OAAO,CAAC,CAAC,SAAS,MAAM,kBAAkB,CAAC,IAAI,CAAC,EAC9C,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAChC,IAAI,CAAC;IACR,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,WAAW,IAAI,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAIzE,KAAK,0BAA0B,CAC7B,IAAI,SAAS,oBAAoB,EACjC,GAAG,SAAS,oBAAoB,IAC9B;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;CACjD,CAAC;AAGF,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;gBAE/C,OAAO,GAAE,uBAA4B;IAiBjD,kBAAkB,CAChB,UAAU,SAAS,oBAAoB,EACvC,SAAS,SAAS,oBAAoB,EAEtC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,IAAI,CACX,0BAA0B,CAAC,UAAU,EAAE,SAAS,CAAC,EACjD,UAAU,GAAG,qBAAqB,CACnC,GACA,mBAAmB,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAQ7F,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpE,aAAa,CAAC,IAAI,EAChB,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,EACV,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAIP,aAAa,CAAC,IAAI,EAChB,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,EACV,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAIP,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAK/E,QAAQ,CACZ,IAAI,GAAE,MAAiC,EACvC,MAAM,SAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC;CAIjB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAE9F"}
package/dist/stream/ws.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
3
+ import { init_runtime_type, runtimeTypeOf } from "../runtime-type.js";
2
4
  import { generateSpanId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
3
5
  import { createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike } from "./ws-telemetry.js";
4
6
  import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
5
- import { z as z$1 } from "zod";
7
+ import { z } from "zod";
6
8
  import { randomUUID } from "node:crypto";
7
9
  import { hostname } from "node:os";
8
10
  //#region src/stream/ws.ts
@@ -10,7 +12,7 @@ function createWebSocketRuntime(options = {}) {
10
12
  return new WebSocketRuntime(options);
11
13
  }
12
14
  function normalizeMessage(raw) {
13
- if (typeof raw === "string") return raw;
15
+ if (isStringValue(raw)) return raw;
14
16
  if (raw instanceof Buffer) return raw.toString("utf-8");
15
17
  if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString("utf-8");
16
18
  if (Array.isArray(raw)) return Buffer.concat(raw.filter((chunk) => chunk instanceof Buffer)).toString("utf-8");
@@ -36,6 +38,8 @@ function deriveLifetimeStatus(code) {
36
38
  }
37
39
  var WS_CONNECTING, WS_OPEN, WS_CLOSED, WS_CLOSE_CODE_GOING_AWAY, WS_CLOSE_CODE_INVALID_FRAME_PAYLOAD_DATA, WS_CLOSE_CODE_POLICY_VIOLATION, WS_CLOSE_CODE_INTERNAL_ERROR, WS_CLOSE_CODE_TRY_AGAIN_LATER, MAX_PENDING_MESSAGES, MAX_PENDING_OUTBOUND_MESSAGES, MAX_SOCKET_BUFFERED_AMOUNT, OUTBOUND_BATCH_SIZE, OUTBOUND_RETRY_DELAY_MS, WebSocketEnvelopeSchema, WebSocketRuntime, WebSocketConnectionImpl;
38
40
  var init_ws = __esmMin((() => {
41
+ init_runtime_type();
42
+ init_runtime_value();
39
43
  init_ws_registry();
40
44
  init_ws_telemetry();
41
45
  init_ws_telemetry_trace();
@@ -52,12 +56,12 @@ var init_ws = __esmMin((() => {
52
56
  MAX_SOCKET_BUFFERED_AMOUNT = 1048576;
53
57
  OUTBOUND_BATCH_SIZE = 50;
54
58
  OUTBOUND_RETRY_DELAY_MS = 5;
55
- WebSocketEnvelopeSchema = z$1.object({
56
- event: z$1.string(),
57
- data: z$1.unknown(),
58
- meta: z$1.object({
59
- traceparent: z$1.string().optional(),
60
- tracestate: z$1.string().optional()
59
+ WebSocketEnvelopeSchema = z.object({
60
+ event: z.string(),
61
+ data: z.json(),
62
+ meta: z.object({
63
+ traceparent: z.string().optional(),
64
+ tracestate: z.string().optional()
61
65
  }).optional()
62
66
  });
63
67
  WebSocketRuntime = class {
@@ -124,9 +128,9 @@ var init_ws = __esmMin((() => {
124
128
  connectionParentSpanId;
125
129
  connectionSampled;
126
130
  connectionStartedAt = performance.now();
127
- _userId;
131
+ currentUserId;
128
132
  get userId() {
129
- return this._userId;
133
+ return this.currentUserId;
130
134
  }
131
135
  closedInternal = false;
132
136
  closeStarted = false;
@@ -143,8 +147,8 @@ var init_ws = __esmMin((() => {
143
147
  this.connectionSpanId = options.spanId;
144
148
  this.connectionParentSpanId = options.parentSpanId;
145
149
  this.connectionSampled = options.sampled;
146
- this.eventSchemasIn = options.inEvents.shape;
147
- this.eventSchemasOut = options.outEvents.shape;
150
+ this.eventSchemasIn = options.inEvents["shape"];
151
+ this.eventSchemasOut = options.outEvents["shape"];
148
152
  let resolveClosePromise;
149
153
  this.closePromise = new Promise((resolve) => {
150
154
  resolveClosePromise = resolve;
@@ -186,11 +190,11 @@ var init_ws = __esmMin((() => {
186
190
  this.options.registry.leave(this.id, roomId);
187
191
  }
188
192
  setUserId(userId) {
189
- this._userId = String(userId);
193
+ this.currentUserId = String(userId);
190
194
  this.options.registry.setUserId(this.id, userId);
191
195
  }
192
196
  clearUserId() {
193
- this._userId = void 0;
197
+ this.currentUserId = void 0;
194
198
  this.options.registry.clearUserId(this.id);
195
199
  }
196
200
  getTelemetrySnapshot() {
@@ -212,7 +216,7 @@ var init_ws = __esmMin((() => {
212
216
  return {
213
217
  connectionId: this.id,
214
218
  namespace: this.namespace,
215
- userId: this._userId,
219
+ userId: this.currentUserId,
216
220
  traceId: this.connectionTraceId,
217
221
  spanId: this.connectionSpanId,
218
222
  parentSpanId: this.connectionParentSpanId,
@@ -271,7 +275,7 @@ var init_ws = __esmMin((() => {
271
275
  });
272
276
  };
273
277
  handleClose = (code, reason) => {
274
- const reasonText = typeof reason === "string" ? reason : reason?.toString();
278
+ const reasonText = isStringValue(reason) ? reason : reason?.toString();
275
279
  this.markClosed(code, reasonText);
276
280
  };
277
281
  handleError = () => {
@@ -345,7 +349,7 @@ var init_ws = __esmMin((() => {
345
349
  const messageTraceFields = {
346
350
  connectionId: this.id,
347
351
  namespace: this.namespace,
348
- userId: this._userId,
352
+ userId: this.currentUserId,
349
353
  traceId: traceCtx.traceId,
350
354
  spanId: traceCtx.spanId,
351
355
  parentSpanId: traceCtx.parentSpanId,
@@ -439,7 +443,7 @@ var init_ws = __esmMin((() => {
439
443
  this.enqueueOutboundMessage(JSON.stringify({
440
444
  event,
441
445
  data: parsed.data
442
- }), event, parsed.data);
446
+ }), event);
443
447
  }
444
448
  markClosed(code, _reason) {
445
449
  if (this.closedInternal) return;
@@ -516,7 +520,7 @@ var init_ws = __esmMin((() => {
516
520
  this.close(WS_CLOSE_CODE_INTERNAL_ERROR, "Message handling failed");
517
521
  });
518
522
  }
519
- enqueueOutboundMessage(payload, event, data) {
523
+ enqueueOutboundMessage(payload, event) {
520
524
  if (this.pendingOutboundMessages.length >= MAX_PENDING_OUTBOUND_MESSAGES) {
521
525
  this.options.telemetryController.emit({
522
526
  name: "ws.backpressure.overflow",
@@ -535,7 +539,7 @@ var init_ws = __esmMin((() => {
535
539
  level: "debug",
536
540
  ...this.telemetryFields(),
537
541
  detail: { event },
538
- payload: data
542
+ payload: safeParseEnvelope(payload)?.data
539
543
  });
540
544
  this.scheduleOutboundFlush();
541
545
  }
@@ -613,7 +617,7 @@ var init_ws = __esmMin((() => {
613
617
  status: "error",
614
618
  ...fields,
615
619
  attributes: { event },
616
- errorType: error instanceof Error ? error.name : typeof error
620
+ errorType: error instanceof Error ? error.name : runtimeTypeOf(error)
617
621
  });
618
622
  this.close(WS_CLOSE_CODE_INTERNAL_ERROR, "Outbound publish failed");
619
623
  return;
@@ -629,4 +633,4 @@ var init_ws = __esmMin((() => {
629
633
  init_ws();
630
634
  export { WebSocketRuntime, createWebSocketRuntime, init_ws };
631
635
 
632
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBob3N0bmFtZSB9IGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldFByZXNlbmNlU3RvcmUgfSBmcm9tIFwiLi93cy1wcmVzZW5jZS1zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnksXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zLFxuICB0eXBlIFdlYlNvY2tldFJvb21JZCxcbiAgdHlwZSBXZWJTb2NrZXRVc2VySWQsXG59IGZyb20gXCIuL3dzLXJlZ2lzdHJ5XCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uU25hcHNob3QsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlPcHRpb25zLFxuICB0eXBlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbixcbiAgY3JlYXRlV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgaXNQcm9taXNlTGlrZSxcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5pbXBvcnQgeyBwYXJzZVRyYWNlUGFyZW50LCBnZW5lcmF0ZVNwYW5JZCB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS10cmFjZVwiO1xuXG4vLyB0cmFuc3BvcnQtbGV2ZWwg7IOB7IiY7JmAIHF1ZXVlIHRocmVzaG9sZOulvCDtlZwg7YyM7J287JeQIOuqqOyVhCBsaWZlY3ljbGUvYmFja3ByZXNzdXJlIOygleyxheydhCDspJHslZntmZTtlahcbmNvbnN0IFdTX0NPTk5FQ1RJTkcgPSAwO1xuY29uc3QgV1NfT1BFTiA9IDE7XG5jb25zdCBXU19DTE9TRUQgPSAzO1xuLy8gUkZDIDY0NTUgY2xvc2UgY29kZXMgdXNlZCBieSBTb25hbXUncyBXZWJTb2NrZXQgcnVudGltZS5cbmNvbnN0IFdTX0NMT1NFX0NPREVfR09JTkdfQVdBWSA9IDEwMDE7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBID0gMTAwNztcbmNvbnN0IFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiA9IDEwMDg7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SID0gMTAxMTtcbmNvbnN0IFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSID0gMTAxMztcbmNvbnN0IE1BWF9QRU5ESU5HX01FU1NBR0VTID0gMTAwO1xuY29uc3QgTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMgPSAxXzAwMDtcbmNvbnN0IE1BWF9TT0NLRVRfQlVGRkVSRURfQU1PVU5UID0gMV8wNDhfNTc2O1xuY29uc3QgT1VUQk9VTkRfQkFUQ0hfU0laRSA9IDUwO1xuY29uc3QgT1VUQk9VTkRfUkVUUllfREVMQVlfTVMgPSA1O1xuXG4vLyBlbnZlbG9wZeydhCBge2V2ZW50LCBkYXRhfWAg7ZiV7YOc66GcIOqzoOygle2VtCBzZXJ2ZXIgaGFuZGxlcuyZgCBnZW5lcmF0ZWQgY2xpZW506rCAIOqwmeydgCBmcmFtaW5nIGNvbnRyYWN066W8IOyTsOqyjCDtlahcbi8vIG1ldGHripQgb3B0aW9uYWzsnbTrr4DroZwg6riw7KG0IGB7ZXZlbnQsIGRhdGF9YCDrqZTsi5zsp4Drj4Qg6re464yA66GcIO2MjOyLseuQqCAoYmFja3dhcmQtY29tcGF0aWJsZSlcbmNvbnN0IFdlYlNvY2tldEVudmVsb3BlU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudDogei5zdHJpbmcoKSxcbiAgZGF0YTogei51bmtub3duKCksXG4gIG1ldGE6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHRyYWNlcGFyZW50OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB0cmFjZXN0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG50eXBlIE1lc3NhZ2VIYW5kbGVyPFQ+ID0gKFxuICBkYXRhOiBULFxuICB0ZWxlbWV0cnlDb250ZXh0PzogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBDbG9zZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXZlbnRNYXAgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxudHlwZSBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRTY2hlbWEgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPiA9IHouaW5mZXI8ei5ab2RPYmplY3Q8VFNjaGVtYT4+O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRPdXRFdmVudHM8VE91dCBleHRlbmRzIFdlYlNvY2tldEV2ZW50TWFwID0gV2ViU29ja2V0RXZlbnRNYXA+ID0gVE91dDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0SW5FdmVudHM8VEluIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRNYXAgPSBXZWJTb2NrZXRFdmVudE1hcD4gPSBUSW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0Q29ubmVjdGlvbjxcbiAgVE91dCBleHRlbmRzIFdlYlNvY2tldEV2ZW50TWFwID0gV2ViU29ja2V0RXZlbnRNYXAsXG4gIFRJbiBleHRlbmRzIFdlYlNvY2tldEV2ZW50TWFwID0gV2ViU29ja2V0RXZlbnRNYXAsXG4+IGV4dGVuZHMgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24ge1xuICB0cmFuc3BvcnQ6IFwid3NcIjtcbiAgb25DbG9zZShjYWxsYmFjazogQ2xvc2VIYW5kbGVyKTogdm9pZDtcbiAgb25NZXNzYWdlPEsgZXh0ZW5kcyBrZXlvZiBXZWJTb2NrZXRJbkV2ZW50czxUSW4+PihcbiAgICBldmVudDogSyxcbiAgICBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxXZWJTb2NrZXRJbkV2ZW50czxUSW4+W0tdPixcbiAgKTogdm9pZDtcbiAgcHVibGlzaDxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQ+PihcbiAgICBldmVudDogSyxcbiAgICBkYXRhOiBXZWJTb2NrZXRPdXRFdmVudHM8VE91dD5bS10sXG4gICk6IHZvaWQ7XG4gIHdhaXRGb3JDbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuICBqb2luKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZDtcbiAgbGVhdmUocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkO1xuICBzZXRVc2VySWQodXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkO1xuICBjbGVhclVzZXJJZCgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBBbnlXZWJTb2NrZXRDb25uZWN0aW9uID0gV2ViU29ja2V0Q29ubmVjdGlvbjxXZWJTb2NrZXRFdmVudE1hcCwgV2ViU29ja2V0RXZlbnRNYXA+O1xuXG50eXBlIFBhcnNlZEVudmVsb3BlID0gei5pbmZlcjx0eXBlb2YgV2ViU29ja2V0RW52ZWxvcGVTY2hlbWE+O1xuXG50eXBlIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFRPdXQgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBUSW4gZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPiA9IHtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG59O1xuXG4vLyByZWdpc3RyeeulvCDshozsnKDtlZjqs6AgY29ubmVjdGlvbiDsg53shLEvc2h1dGRvd27snYQg64u064u57ZWoLiBTb25hbXUg7JWg7ZSM66as7LyA7J207IWYIOyImOuqheyjvOq4sOyZgCDqsJnsnbQg7JuA7KeB7J2064+E66GdIOyEpOqzhO2VqFxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFJ1bnRpbWUge1xuICByZWFkb25seSByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UnVudGltZU9wdGlvbnMgPSB7fSkge1xuICAgIC8vIOu2hOyCsCDtmZjqsr3sl5DshJwg64W465OcIOqwhCDstqnrj4zsnYQg66eJ6riwIOychO2VtCBob3N0bmFtZSArIHBpZOuhnCDrlJTtj7Ttirgg7Iud67OE7J6Q66W8IOunjOuToOuLpC5cbiAgICAvLyDqsJnsnYAg7Zi47Iqk7Yq47JeQIOyXrOufrCDtlITroZzshLjsiqTqsIAg65agIOyeiOyWtOuPhCBwaWTroZwg6rWs67aE65CY66mwLCDroZzqt7gv66mU7Yq466at7JeQ7ISc64+EIOyLneuzhOydtCDsiazsm4BcbiAgICBjb25zdCByZXNvbHZlZE5vZGVJZCA9IG9wdGlvbnMubm9kZUlkID8/IGAke2hvc3RuYW1lKCl9LSR7cHJvY2Vzcy5waWR9YDtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPSBjcmVhdGVXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyKG9wdGlvbnMudGVsZW1ldHJ5LCB7XG4gICAgICBydW50aW1lSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgfSk7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICBub2RlSWQ6IHJlc29sdmVkTm9kZUlkLFxuICAgICAgcHJlc2VuY2VTdG9yZTogb3B0aW9ucy5wcmVzZW5jZVN0b3JlLFxuICAgICAgY2x1c3RlckJ1czogb3B0aW9ucy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBXZWJTb2NrZXRSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICB9XG5cbiAgcmVnaXN0ZXJDb25uZWN0aW9uPFRPdXRTY2hlbWEgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBUSW5TY2hlbWEgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPihcbiAgICBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICBvcHRpb25zOiBPbWl0PFxuICAgICAgV2ViU29ja2V0Q29ubmVjdGlvbk9wdGlvbnM8VE91dFNjaGVtYSwgVEluU2NoZW1hPixcbiAgICAgIFwicmVnaXN0cnlcIiB8IFwidGVsZW1ldHJ5Q29udHJvbGxlclwiXG4gICAgPixcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+IHtcbiAgICByZXR1cm4gbmV3IFdlYlNvY2tldENvbm5lY3Rpb25JbXBsKHNvY2tldCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgYnJvYWRjYXN0KGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Sb29tKHJvb21JZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9Vc2VyKHVzZXJJZDogV2ViU29ja2V0VXNlcklkLCBldmVudDogc3RyaW5nLCBkYXRhOiB1bmtub3duLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1VzZXIodXNlcklkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIC8vIO2UhOuhnOyEuOyKpCDsooXro4wg7IucIOyCtOyVhOyeiOuKlCDsl7DqsrDsnbQg64Ko7KeAIOyViuuPhOuhnSByZWdpc3RyeeulvCDsiJztmoztlbQg7J286rSEIOyiheujjO2VqFxuICBhc3luYyBzaHV0ZG93bihcbiAgICBjb2RlOiBudW1iZXIgPSBXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksXG4gICAgcmVhc29uID0gXCJTZXJ2ZXIgc2h1dHRpbmcgZG93blwiLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZ2lzdHJ5LnNodXRkb3duKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnNodXRkb3duKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFJ1bnRpbWUob3B0aW9uczogV2ViU29ja2V0UnVudGltZU9wdGlvbnMgPSB7fSk6IFdlYlNvY2tldFJ1bnRpbWUge1xuICByZXR1cm4gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucyk7XG59XG5cbmNsYXNzIFdlYlNvY2tldENvbm5lY3Rpb25JbXBsPFRPdXRTY2hlbWEgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlLCBUSW5TY2hlbWEgZXh0ZW5kcyB6LlpvZFJhd1NoYXBlPlxuICBpbXBsZW1lbnRzXG4gICAgV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+LFxuICAgIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbixcbiAgICBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXJcbntcbiAgcmVhZG9ubHkgaWQgPSByYW5kb21VVUlEKCk7XG4gIHJlYWRvbmx5IHRyYW5zcG9ydCA9IFwid3NcIjtcbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUNhbGxiYWNrczogQ2xvc2VIYW5kbGVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8TWVzc2FnZUhhbmRsZXI8dW5rbm93bj4+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdNZXNzYWdlczogUGFyc2VkRW52ZWxvcGVbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBBcnJheTx7IHBheWxvYWQ6IHN0cmluZzsgZXZlbnQ6IHN0cmluZyB9PiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlQ2xvc2VQcm9taXNlOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGhlYXJ0YmVhdE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRTY2hlbWFzSW46IFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZUFueT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRTY2hlbWFzT3V0OiBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGVBbnk+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblRyYWNlSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uUGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TYW1wbGVkPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gY29ubmVjdGlvbiDsiJjrqoUg64+Z7JWIIOycoOyngOuQmOuKlCDsi53rs4TsnpAuIHNldFVzZXJJZC9jbGVhclVzZXJJZOuhnCDsl4XrjbDsnbTtirjrkJjrqbAgZW1pdCBob3QgcGF0aOyXkOyEnCDrp6TrsoggcmVnaXN0cnkgbG9va3Vw7ZWY7KeAIOyViuuPhOuhnSDsupDsi5ztlahcbiAgcHJpdmF0ZSBfdXNlcklkPzogc3RyaW5nO1xuXG4gIGdldCB1c2VySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcklkO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZWRJbnRlcm5hbCA9IGZhbHNlO1xuICBwcml2YXRlIGNsb3NlU3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICBwcml2YXRlIGhlYXJ0YmVhdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHJpdmF0ZSBvdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb2NrZXQ6IFdlYlNvY2tldCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFRPdXRTY2hlbWEsIFRJblNjaGVtYT4sXG4gICkge1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2UgPz8gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy5oZWFydGJlYXRNcyA9IG9wdGlvbnMuaGVhcnRiZWF0ID8/IDMwMDAwO1xuICAgIHRoaXMuY29ubmVjdGlvblRyYWNlSWQgPSBvcHRpb25zLnRyYWNlSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU3BhbklkID0gb3B0aW9ucy5zcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkID0gb3B0aW9ucy5wYXJlbnRTcGFuSWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uU2FtcGxlZCA9IG9wdGlvbnMuc2FtcGxlZDtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc0luID0gb3B0aW9ucy5pbkV2ZW50cy5zaGFwZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZUFueT47XG4gICAgdGhpcy5ldmVudFNjaGVtYXNPdXQgPSBvcHRpb25zLm91dEV2ZW50cy5zaGFwZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZUFueT47XG5cbiAgICBsZXQgcmVzb2x2ZUNsb3NlUHJvbWlzZSE6ICgpID0+IHZvaWQ7XG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlID0gcmVzb2x2ZUNsb3NlUHJvbWlzZTtcblxuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgdGhpcy5oYW5kbGVNZXNzYWdlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVFcnJvcik7XG4gICAgdGhpcy5zb2NrZXQub24oXCJwb25nXCIsIHRoaXMuaGFuZGxlUG9uZyk7XG4gICAgdGhpcy5zdGFydEhlYXJ0YmVhdCgpO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZWRJbnRlcm5hbDtcbiAgfVxuXG4gIG9uQ2xvc2UoY2FsbGJhY2s6IENsb3NlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VEluU2NoZW1hPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+W0tdPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBTdHJpbmcoZXZlbnQpO1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnMuZ2V0KGV2ZW50S2V5KSA/PyBbXTtcbiAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIgYXMgTWVzc2FnZUhhbmRsZXI8dW5rbm93bj4pO1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLnNldChldmVudEtleSwgaGFuZGxlcnMpO1xuICAgIHRoaXMuZmx1c2hQZW5kaW5nTWVzc2FnZXMoZXZlbnRLZXkpO1xuICB9XG5cbiAgcHVibGlzaDxLIGV4dGVuZHMga2V5b2YgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgZGF0YTogSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPltLXSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVmFsaWRhdGVkKFN0cmluZyhldmVudCksIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFVudHlwZWQoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVibGlzaFZhbGlkYXRlZChldmVudCwgZGF0YSk7XG4gIH1cblxuICB3YWl0Rm9yQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VQcm9taXNlO1xuICB9XG5cbiAgam9pbihyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5qb2luKHRoaXMuaWQsIHJvb21JZCk7XG4gIH1cblxuICBsZWF2ZShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5sZWF2ZSh0aGlzLmlkLCByb29tSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlcklkID0gU3RyaW5nKHVzZXJJZCk7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnNldFVzZXJJZCh0aGlzLmlkLCB1c2VySWQpO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlcklkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5jbGVhclVzZXJJZCh0aGlzLmlkKTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiB0aGlzLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX09QRU4gPyB0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA6IDAsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRlbGVtZXRyeUNvbnRleHQoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIOuqqOuToCB0ZWxlbWV0cnkgZW1pdCBzaXRl6rCAIOqzteycoO2VmOuKlCBjb25uZWN0aW9uLWxldmVsIGZpZWxkIOustuydjC5cbiAgLy8g7Zal7ZuEIGNvbm5lY3Rpb24tc2NvcGVkIOyLneuzhOyekChlLmcuIHRlbmFudElkKeqwgCDstpTqsIDrkKAg65WMIO2VnCDqs7Prp4wg7IaQ64yA66m0IOuQqFxuICBwcml2YXRlIHRlbGVtZXRyeUZpZWxkcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5fdXNlcklkLFxuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLmNvbm5lY3Rpb25QYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0aGlzLmNvbm5lY3Rpb25TYW1wbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbmJvdW5kUmVqZWN0ZWQocmVhc29uOiBzdHJpbmcsIGV2ZW50Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy50ZWxlbWV0cnlGaWVsZHMoKTtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5yZWplY3RlZFwiLFxuICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgLi4uZmllbGRzLFxuICAgICAgZGV0YWlsOiBldmVudCAhPT0gdW5kZWZpbmVkID8geyByZWFzb24sIGV2ZW50IH0gOiB7IHJlYXNvbiB9LFxuICAgIH0pO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5tZXNzYWdlc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBkaXJlY3Rpb246IFwiaW5ib3VuZFwiLCBvdXRjb21lOiBcInJlamVjdGVkXCIgfSxcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRyYW5zcG9ydCDsooXro4wg64+E7KSRIOyYiOyZuOqwgCDrgpjrj4QgbWFya0Nsb3NlZOqwgCDrsJjrk5zsi5wg7Iuk7ZaJ65CY64+E66GdIHRyeS9maW5hbGx566GcIOqwkOyMiFxuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLmNsb3NlU3RhcnRlZCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DTE9TRUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlU3RhcnRlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvc2VUcmFuc3BvcnQoY29kZSwgcmVhc29uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQ2xvc2VkKGNvZGUsIHJlYXNvbik7XG4gICAgfVxuICB9XG5cbiAgLy8g7J2467CU7Jq065OcIOuplOyLnOyngOulvCDsiJzssKgg7LKY66asIO2BkOyXkCDsmKzrprwuIFNvbmFtdSBlbnZlbG9wZSDqsoDspp0g7IiY7ZaJXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTWVzc2FnZSA9IChyYXc6IHVua25vd24pID0+IHtcbiAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplTWVzc2FnZShyYXcpO1xuICAgICAgY29uc3QgcGFyc2VkRW52ZWxvcGUgPSBzYWZlUGFyc2VFbnZlbG9wZSh0ZXh0KTtcbiAgICAgIGlmICghcGFyc2VkRW52ZWxvcGUpIHtcbiAgICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwiaW52YWxpZFBheWxvYWRcIik7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSwgXCJJbnZhbGlkIG1lc3NhZ2UgcGF5bG9hZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlY2VpdmVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudDogcGFyc2VkRW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgcGF5bG9hZDogcGFyc2VkRW52ZWxvcGUuZGF0YSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnRvdWNoKHRoaXMuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaEVudmVsb3BlKHBhcnNlZEVudmVsb3BlKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUNsb3NlID0gKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlYXNvblRleHQgPSB0eXBlb2YgcmVhc29uID09PSBcInN0cmluZ1wiID8gcmVhc29uIDogcmVhc29uPy50b1N0cmluZygpO1xuICAgIHRoaXMubWFya0Nsb3NlZChjb2RlLCByZWFzb25UZXh0KTtcbiAgfTtcblxuICAvLyDshozsvJPsnbQgdHJhbnNwb3J0IGVycm9y66W8IGVtaXTtlZjrqbQg7KaJ7IucIDEwMTEgY2xvc2XroZwg7IiY66C07Iuc7LycIOyDge2DnCDriITrnb3snYQg66eJ7J2MXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlRXJyb3IgPSAoKSA9PiB7XG4gICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIldlYlNvY2tldCB0cmFuc3BvcnQgZXJyb3JcIik7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVQb25nID0gKCkgPT4ge1xuICAgIHRoaXMuYXdhaXRpbmdQb25nID0gZmFsc2U7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LnRvdWNoKHRoaXMuaWQpO1xuICB9O1xuXG4gIC8vIGVudmVsb3Bl7J2YIG1ldGEudHJhY2VwYXJlbnTroZzrtoDthLAgdHJhY2UgY29udGV4dOulvCDstpTstpztlahcbiAgLy8gaW52YWxpZCB0cmFjZXBhcmVudOuKlCDsl7DqsrDsnYQg6rGw67aA7ZWY7KeAIOyViuqzoCBkZWJ1ZyDroIjrsqgg6rK96rOg66eMIGVtaXTtlahcbiAgcHJpdmF0ZSByZXNvbHZlTWVzc2FnZVRyYWNlQ29udGV4dChcbiAgICBlbnZlbG9wZTogUGFyc2VkRW52ZWxvcGUsXG4gICk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICBjb25zdCBtZXNzYWdlU3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmdldFRyYWNlT3B0aW9ucygpLnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSAmJlxuICAgICAgZW52ZWxvcGUubWV0YT8udHJhY2VwYXJlbnRcbiAgICApIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhY2VQYXJlbnQoZW52ZWxvcGUubWV0YS50cmFjZXBhcmVudCk7XG4gICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJhY2VJZDogcGFyc2VkLnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiBtZXNzYWdlU3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogcGFyc2VkLnBhcmVudElkLFxuICAgICAgICAgIHNhbXBsZWQ6IHBhcnNlZC5zYW1wbGVkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gaW52YWxpZCB0cmFjZXBhcmVudDogd2FybiBidXQgZG8gbm90IHJlamVjdFxuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MudHJhY2UuaW52YWxpZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICBkZXRhaWw6IHsgc291cmNlOiBcIm1lc3NhZ2VcIiwgdHJhY2VwYXJlbnQ6IGVudmVsb3BlLm1ldGEudHJhY2VwYXJlbnQgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiBtZXNzYWdlU3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQgPz8gdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5jb25uZWN0aW9uU2FtcGxlZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gZXZlbnQg7KG07J6sIOyXrOu2gCDihpIgc2NoZW1hIOqygOymnSDihpIgaGFuZGxlciDsi6Ttlokg7Iic7Jy866GcIOu2hOq4sO2VqFxuICAvLyBoYW5kbGVy6rCAIOyVhOyngSDrk7HroZ3rkJjsp4Ag7JWK7J2AIOy0iOq4sCDrqZTsi5zsp4DripQg67KE7Y287JeQIOuztOq0gO2WiOuLpOqwgCBvbk1lc3NhZ2Ug65Ox66GdIOyLnCBmbHVzaO2VqFxuICAvLyBoYW5kbGVy64qUIGBhd2FpdGDsnLzroZwg7Iic7LCoIOyLpO2Wie2VtCDtlZwgY29ubmVjdGlvbiDslYjsnZgg66mU7Iuc7KeAIOyInOyEnOulvCDrs7TsnqXtlahcbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEVudmVsb3BlKGVudmVsb3BlOiBQYXJzZWRFbnZlbG9wZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnMuZ2V0KGVudmVsb3BlLmV2ZW50KTtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmV2ZW50U2NoZW1hc0luW2VudmVsb3BlLmV2ZW50XTtcblxuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICB0aGlzLmVtaXRJbmJvdW5kUmVqZWN0ZWQoXCJ1bmtub3duRXZlbnRcIiwgZW52ZWxvcGUuZXZlbnQpO1xuICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX1BPTElDWV9WSU9MQVRJT04sIFwiVW5rbm93biBldmVudFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKGVudmVsb3BlLmRhdGEpO1xuICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZW1pdEluYm91bmRSZWplY3RlZChcImludmFsaWREYXRhXCIsIGVudmVsb3BlLmV2ZW50KTtcbiAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlZBTElEX0ZSQU1FX1BBWUxPQURfREFUQSwgXCJJbnZhbGlkIGV2ZW50IGRhdGFcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFoYW5kbGVycyB8fCBoYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfTUVTU0FHRVMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmJ1ZmZlci5kcm9wcGVkXCIsXG4gICAgICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLnB1c2goZW52ZWxvcGUpO1xuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5idWZmZXJlZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFjZUN0eCA9IHRoaXMucmVzb2x2ZU1lc3NhZ2VUcmFjZUNvbnRleHQoZW52ZWxvcGUpO1xuICAgIC8vIG1lc3NhZ2UtbGV2ZWwgdHJhY2XripQgY29ubmVjdGlvbi1sZXZlbCB0cmFjZeulvCBvdmVycmlkZe2VqC4gdXNlcklkIC8gY29ubmVjdGlvbklkIC8gbmFtZXNwYWNl64qUIOq3uOuMgOuhnCDsnKDsp4BcbiAgICBjb25zdCBtZXNzYWdlVHJhY2VGaWVsZHMgPSB7XG4gICAgICBjb25uZWN0aW9uSWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lc3BhY2U6IHRoaXMubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiB0aGlzLl91c2VySWQsXG4gICAgICB0cmFjZUlkOiB0cmFjZUN0eC50cmFjZUlkLFxuICAgICAgc3BhbklkOiB0cmFjZUN0eC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ3R4LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRyYWNlQ3R4LnNhbXBsZWQsXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZXIocGFyc2VkLmRhdGEsIHRyYWNlQ3R4KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuZGlzcGF0Y2hlZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAuLi5tZXNzYWdlVHJhY2VGaWVsZHMsXG4gICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUud3MubWVzc2FnZXNcIixcbiAgICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICAgIHZhbHVlOiAxLFxuICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgdGFnczogeyBkaXJlY3Rpb246IFwiaW5ib3VuZFwiLCBldmVudDogZW52ZWxvcGUuZXZlbnQsIG91dGNvbWU6IFwiYWNjZXB0ZWRcIiB9LFxuICAgICAgICAuLi5tZXNzYWdlVHJhY2VGaWVsZHMsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5mYWlsZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgLi4ubWVzc2FnZVRyYWNlRmllbGRzLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hQZW5kaW5nTWVzc2FnZXMoZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlbWFpbmluZzogUGFyc2VkRW52ZWxvcGVbXSA9IFtdO1xuICAgIGNvbnN0IHRvRmx1c2g6IFBhcnNlZEVudmVsb3BlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0aGlzLnBlbmRpbmdNZXNzYWdlcykge1xuICAgICAgaWYgKG1lc3NhZ2UuZXZlbnQgIT09IGV2ZW50KSB7XG4gICAgICAgIHJlbWFpbmluZy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdG9GbHVzaC5wdXNoKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nTWVzc2FnZXMucHVzaCguLi5yZW1haW5pbmcpO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHRvRmx1c2gpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU1lc3NhZ2VUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaEVudmVsb3BlKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwdWJsaXNoVmFsaWRhdGVkKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmV2ZW50U2NoZW1hc091dFtldmVudF07XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucmVqZWN0ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50LCByZWFzb246IFwidW5rbm93bkV2ZW50XCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHdlYnNvY2tldCBldmVudDogJHtldmVudH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKGRhdGEpO1xuICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucmVqZWN0ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50LCByZWFzb246IFwiaW52YWxpZFBheWxvYWRcIiB9LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2Vic29ja2V0IGV2ZW50IHBheWxvYWQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwgfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV1NfT1BFTikge1xuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5kcm9wcGVkXCIsXG4gICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImNvbm5lY3Rpb25DbG9zZWRcIiB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnF1ZXVlT3V0Ym91bmRNZXNzYWdlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudCxcbiAgICAgICAgZGF0YTogcGFyc2VkLmRhdGEsXG4gICAgICB9KSxcbiAgICAgIGV2ZW50LFxuICAgICAgcGFyc2VkLmRhdGEsXG4gICAgKTtcbiAgfVxuXG4gIC8vIGxpc3RlbmVyIO2VtOygnCAvIGhlYXJ0YmVhdCDspJHri6ggLyBwZW5kaW5nIHF1ZXVlIOu5hOybgCAvIHJlZ2lzdHJ5IHVucmVnaXN0ZXIgLyBvbkNsb3NlIOyLpO2WiSAvIHdhaXRGb3JDbG9zZSByZXNvbHZlIOydhCDtlZwg6rOz7JeQIOuqqOyVhCDsm5DsnpDsoIHsnLzroZwg7LKY66as7ZWoXG4gIC8vIGFzeW5jIG9uQ2xvc2XqsIAgcmVqZWN07ZW064+EIHVuaGFuZGxlZCByZWplY3Rpb27snLzroZwg7IOI7KeAIOyViuuPhOuhnSBjYXRjaOuhnCDqsqnrpqztlahcbiAgcHJpdmF0ZSBtYXJrQ2xvc2VkKGNvZGU/OiBudW1iZXIsIF9yZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VkSW50ZXJuYWwgPSB0cnVlO1xuICAgIHRoaXMuY2xvc2VTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0KCk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy50ZWxlbWV0cnlGaWVsZHMoKTtcbiAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5jbG9zZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIC4uLmZpZWxkcyxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZ2V0VHJhY2VPcHRpb25zKCkucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3Bhbikge1xuICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MuY29ubmVjdGlvbi5saWZldGltZVwiLFxuICAgICAgICBraW5kOiBcInNlcnZlclwiLFxuICAgICAgICBkdXJhdGlvbk1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuY29ubmVjdGlvblN0YXJ0ZWRBdCxcbiAgICAgICAgc3RhdHVzOiBkZXJpdmVMaWZldGltZVN0YXR1cyhjb2RlKSxcbiAgICAgICAgLi4uZmllbGRzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0Lm9mZihcIm1lc3NhZ2VcIiwgdGhpcy5oYW5kbGVNZXNzYWdlKTtcbiAgICB0aGlzLnNvY2tldC5vZmYoXCJjbG9zZVwiLCB0aGlzLmhhbmRsZUNsb3NlKTtcbiAgICB0aGlzLnNvY2tldC5vZmYoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB0aGlzLnNvY2tldC5vZmYoXCJwb25nXCIsIHRoaXMuaGFuZGxlUG9uZyk7XG4gICAgdGhpcy5hd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzLmlkKTtcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2xvc2VDYWxsYmFja3Muc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjaygpO1xuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyZXN1bHQpKSB7XG4gICAgICAgICAgdm9pZCByZXN1bHQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgLy8gYXN5bmMgY2xvc2UgY2FsbGJhY2tzIG11c3Qgbm90IGVzY2FwZSBhcyB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gY2xvc2UgY2FsbGJhY2tzIG11c3Qgbm90IGJsb2NrIHRyYW5zcG9ydCBjbGVhbnVwXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVzb2x2ZUNsb3NlUHJvbWlzZSgpO1xuICB9XG5cbiAgLy8gcG9uZ+ydtCDsmKTsp4Ag7JWK7J2AIOyDge2DnOyXkOyEnCDri6TsnYwgdGlja+ydtCDsmKTrqbQgdGltZW91dCBjbG9zZeuhnCDsspjrpqztlbQgem9tYmllIGNvbm5lY3Rpb27snYQg7KCV66as7ZWoXG4gIHByaXZhdGUgc3RhcnRIZWFydGJlYXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVhcnRiZWF0TXMgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXdhaXRpbmdQb25nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MuaGVhcnRiZWF0LnRpbWVvdXRcIixcbiAgICAgICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLCBcIkhlYXJ0YmVhdCB0aW1lb3V0XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXdhaXRpbmdQb25nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc29ja2V0LnBpbmcoKTtcbiAgICB9LCB0aGlzLmhlYXJ0YmVhdE1zKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGVhcnRiZWF0VGltZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnRiZWF0VGltZXIpO1xuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBudWxsO1xuICB9XG5cbiAgLy8gY2xvc2XqsIAg7Iuk7Yyo7ZW064+EIHRlcm1pbmF0ZSDtj7TrsLHquYzsp4Ag7Iuc64+E7ZWY6rOgLCDrgZ3rgrQg7Iuk7Yyo7ZWY66m0IG1hcmtDbG9zZWTsl5Ag7IOB7YOcIOygleumrOulvCDsnITsnoTtlahcbiAgcHJpdmF0ZSBjbG9zZVRyYW5zcG9ydChjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX09QRU4gfHwgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfQ09OTkVDVElORykge1xuICAgICAgICB0aGlzLnNvY2tldC5jbG9zZShjb2RlLCB0cnVuY2F0ZUNsb3NlUmVhc29uKHJlYXNvbikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gdHJhbnNwb3J0IGlzIGFscmVhZHkgYnJva2VuOyBzdGF0ZSBjbGVhbnVwIGlzIGhhbmRsZWQgYnkgbWFya0Nsb3NlZCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g7J2467CU7Jq065OcIGhhbmRsZXLrpbwgcHJvbWlzZSBjaGFpbuycvOuhnCBzZXJpYWxpemUg7ZWY6rOgLCBoYW5kbGVyIOyYiOyZuOuKlCBjb25uZWN0aW9uLWxvY2FsIDEwMTEgY2xvc2XroZwg7LaV7IaM7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU1lc3NhZ2VUYXNrKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IHRoaXMubWVzc2FnZVF1ZXVlXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGFzaygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiwgXCJNZXNzYWdlIGhhbmRsaW5nIGZhaWxlZFwiKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gcXVldWXqsIAg7ZWc6rOE7JeQIOuPhOuLrO2VmOuptCAxMDEz7Jy866GcIOuLq+yVhCDripDrprAg7IaM67mE7J6Q6rCAIOuplOuqqOumrOulvCDrgZ3sl4bsnbQg7J6h7JWE66i57KeAIOuqu+2VmOqyjCDtlahcbiAgLy8gZGF0YSDsnbjsnpDripQgdGVsZW1ldHJ5IHBheWxvYWQgcHJldmlldyDsmqnrj4TroZzrp4wg7IKs7Jqp7ZWY66mwIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2Vz7JeQ64qUIOyggOyepe2VmOyngCDslYrsnYwgKO2BkCDrqZTrqqjrpqwg67O07Zi4KVxuICBwcml2YXRlIGVucXVldWVPdXRib3VuZE1lc3NhZ2UocGF5bG9hZDogc3RyaW5nLCBldmVudDogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID49IE1BWF9QRU5ESU5HX09VVEJPVU5EX01FU1NBR0VTKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5iYWNrcHJlc3N1cmUub3ZlcmZsb3dcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX1RSWV9BR0FJTl9MQVRFUiwgXCJXZWJTb2NrZXQgYmFja3ByZXNzdXJlIG92ZXJmbG93XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMucHVzaCh7IHBheWxvYWQsIGV2ZW50IH0pO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnF1ZXVlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgIHBheWxvYWQ6IGRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk91dGJvdW5kIHB1Ymxpc2ggZmFpbGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbnQgKz0gMTtcbiAgICAgIGlmICh0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA+IE1BWF9TT0NLRVRfQlVGRkVSRURfQU1PVU5UKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVPdXRib3VuZEZsdXNoKFxuICAgICAgICB0aGlzLnNvY2tldC5idWZmZXJlZEFtb3VudCA+IE1BWF9TT0NLRVRfQlVGRkVSRURfQU1PVU5UID8gT1VUQk9VTkRfUkVUUllfREVMQVlfTVMgOiAwLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTWVzc2FnZShyYXc6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHJhdyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICBpZiAocmF3IGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgcmV0dXJuIHJhdy50b1N0cmluZyhcInV0Zi04XCIpO1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHJhdykudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChyYXcuZmlsdGVyKChjaHVuayk6IGNodW5rIGlzIEJ1ZmZlciA9PiBjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikpLnRvU3RyaW5nKFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmF3KTtcbn1cblxuZnVuY3Rpb24gc2FmZVBhcnNlRW52ZWxvcGUocmF3OiBzdHJpbmcpOiBQYXJzZWRFbnZlbG9wZSB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB1bmtub3duO1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IFdlYlNvY2tldEVudmVsb3BlU2NoZW1hLnNhZmVQYXJzZShwYXJzZWQpO1xuICAgIHJldHVybiB2YWxpZGF0ZWQuc3VjY2VzcyA/IHZhbGlkYXRlZC5kYXRhIDogbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gUkZDIDY0NTXqsIAgY2xvc2UgZnJhbWUgcmVhc29u7J2EIDEyMyBieXRl66GcIOygnO2VnO2VmOuvgOuhnCDstIjqs7zrtoTsnYAg7J6Y6528IOyghOyGoSDsi6TtjKjrpbwg67Cp7KeA7ZWoXG5mdW5jdGlvbiB0cnVuY2F0ZUNsb3NlUmVhc29uKHJlYXNvbj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmVhc29uKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChyZWFzb24sIFwidXRmLThcIikgPD0gMTIzXG4gICAgPyByZWFzb25cbiAgICA6IEJ1ZmZlci5mcm9tKHJlYXNvbikuc3ViYXJyYXkoMCwgMTIzKS50b1N0cmluZyhcInV0Zi04XCIpO1xufVxuXG4vLyBjb25uZWN0aW9uIGxpZmV0aW1lIHNwYW7snZggc3RhdHVz66W8IGNsb3NlIGNvZGUg6riw7KSA7Jy866GcIOu2hOq4sO2VqCAoMTAwMC8xMDAxIOygleyDgSDsooXro4wsIOq3uCDsmbgga25vd24gY29kZSBlcnJvciwgY29kZSDrr7jsg4HsnYAgdW5zZXQpXG5mdW5jdGlvbiBkZXJpdmVMaWZldGltZVN0YXR1cyhjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBcIm9rXCIgfCBcImVycm9yXCIgfCBcInVuc2V0XCIge1xuICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJ1bnNldFwiO1xuICBpZiAoY29kZSA9PT0gMTAwMCB8fCBjb2RlID09PSAxMDAxKSByZXR1cm4gXCJva1wiO1xuICByZXR1cm4gXCJlcnJvclwiO1xufVxuIl0sIm1hcHBpbmdz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
636
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwibm9kZTpvc1wiO1xuXG5pbXBvcnQgeyB0eXBlIFJhd0RhdGEsIHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldFByZXNlbmNlU3RvcmUgfSBmcm9tIFwiLi93cy1wcmVzZW5jZS1zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnksXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zLFxuICB0eXBlIFdlYlNvY2tldFJvb21JZCxcbiAgdHlwZSBXZWJTb2NrZXRVc2VySWQsXG59IGZyb20gXCIuL3dzLXJlZ2lzdHJ5XCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uU25hcHNob3QsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlPcHRpb25zLFxuICB0eXBlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbixcbiAgY3JlYXRlV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgaXNQcm9taXNlTGlrZSxcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5pbXBvcnQgeyBwYXJzZVRyYWNlUGFyZW50LCBnZW5lcmF0ZVNwYW5JZCB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS10cmFjZVwiO1xuXG4vLyB0cmFuc3BvcnQtbGV2ZWwg7IOB7IiY7JmAIHF1ZXVlIHRocmVzaG9sZOulvCDtlZwg7YyM7J287JeQIOuqqOyVhCBsaWZlY3ljbGUvYmFja3ByZXNzdXJlIOygleyxheydhCDspJHslZntmZTtlahcbmNvbnN0IFdTX0NPTk5FQ1RJTkcgPSAwO1xuY29uc3QgV1NfT1BFTiA9IDE7XG5jb25zdCBXU19DTE9TRUQgPSAzO1xuLy8gUkZDIDY0NTUgY2xvc2UgY29kZXMgdXNlZCBieSBTb25hbXUncyBXZWJTb2NrZXQgcnVudGltZS5cbmNvbnN0IFdTX0NMT1NFX0NPREVfR09JTkdfQVdBWSA9IDEwMDE7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBID0gMTAwNztcbmNvbnN0IFdTX0NMT1NFX0NPREVfUE9MSUNZX1ZJT0xBVElPTiA9IDEwMDg7XG5jb25zdCBXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SID0gMTAxMTtcbmNvbnN0IFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSID0gMTAxMztcbmNvbnN0IE1BWF9QRU5ESU5HX01FU1NBR0VTID0gMTAwO1xuY29uc3QgTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMgPSAxXzAwMDtcbmNvbnN0IE1BWF9TT0NLRVRfQlVGRkVSRURfQU1PVU5UID0gMV8wNDhfNTc2O1xuY29uc3QgT1VUQk9VTkRfQkFUQ0hfU0laRSA9IDUwO1xuY29uc3QgT1VUQk9VTkRfUkVUUllfREVMQVlfTVMgPSA1O1xuXG4vLyBlbnZlbG9wZeydhCBge2V2ZW50LCBkYXRhfWAg7ZiV7YOc66GcIOqzoOygle2VtCBzZXJ2ZXIgaGFuZGxlcuyZgCBnZW5lcmF0ZWQgY2xpZW506rCAIOqwmeydgCBmcmFtaW5nIGNvbnRyYWN066W8IOyTsOqyjCDtlahcbi8vIG1ldGHripQgb3B0aW9uYWzsnbTrr4DroZwg6riw7KG0IGB7ZXZlbnQsIGRhdGF9YCDrqZTsi5zsp4Drj4Qg6re464yA66GcIO2MjOyLseuQqCAoYmFja3dhcmQtY29tcGF0aWJsZSlcbmNvbnN0IFdlYlNvY2tldEVudmVsb3BlU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudDogei5zdHJpbmcoKSxcbiAgZGF0YTogei5qc29uKCksXG4gIG1ldGE6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIHRyYWNlcGFyZW50OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB0cmFjZXN0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG50eXBlIE1lc3NhZ2VIYW5kbGVyPFQ+ID0gKFxuICBkYXRhOiBULFxuICB0ZWxlbWV0cnlDb250ZXh0PzogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQsXG4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBDbG9zZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0RXZlbnRNYXA8RXZlbnRQYXlsb2FkID0gbmV2ZXI+ID0gUmVjb3JkPHN0cmluZywgRXZlbnRQYXlsb2FkPjtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRyYW5zcG9ydCA9IFBpY2s8XG4gIFdlYlNvY2tldCxcbiAgXCJidWZmZXJlZEFtb3VudFwiIHwgXCJjbG9zZVwiIHwgXCJwaW5nXCIgfCBcInJlYWR5U3RhdGVcIiB8IFwic2VuZFwiIHwgXCJ0ZXJtaW5hdGVcIlxuPiAmIHtcbiAgb2ZmOiAoLi4uYXJnczogUGFyYW1ldGVyczxFdmVudEVtaXR0ZXJbXCJvZmZcIl0+KSA9PiB2b2lkO1xuICBvbjogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8RXZlbnRFbWl0dGVyW1wib25cIl0+KSA9PiB2b2lkO1xufTtcblxudHlwZSBXZWJTb2NrZXRFdmVudEZpZWxkcyA9IFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZT47XG50eXBlIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzPiA9IHouaW5mZXI8ei5ab2RPYmplY3Q8VFNjaGVtYT4+O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRPdXRFdmVudHM8VE91dCBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwPiA9IFRPdXQ7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEluRXZlbnRzPFRJbiBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwPiA9IFRJbjtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDb25uZWN0aW9uPFxuICBUT3V0IGV4dGVuZHMgb2JqZWN0ID0gV2ViU29ja2V0RXZlbnRNYXAsXG4gIFRJbiBleHRlbmRzIG9iamVjdCA9IFdlYlNvY2tldEV2ZW50TWFwLFxuPiBleHRlbmRzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIHtcbiAgdHJhbnNwb3J0OiBcIndzXCI7XG4gIG9uQ2xvc2UoY2FsbGJhY2s6IENsb3NlSGFuZGxlcik6IHZvaWQ7XG4gIG9uTWVzc2FnZTxLIGV4dGVuZHMga2V5b2YgV2ViU29ja2V0SW5FdmVudHM8VEluPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8V2ViU29ja2V0SW5FdmVudHM8VEluPltLXT4sXG4gICk6IHZvaWQ7XG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIFdlYlNvY2tldE91dEV2ZW50czxUT3V0Pj4oXG4gICAgZXZlbnQ6IEssXG4gICAgZGF0YTogV2ViU29ja2V0T3V0RXZlbnRzPFRPdXQ+W0tdLFxuICApOiB2b2lkO1xuICB3YWl0Rm9yQ2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbiAgam9pbihyb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQ7XG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZDtcbiAgc2V0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZDtcbiAgY2xlYXJVc2VySWQoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbiA9IFdlYlNvY2tldENvbm5lY3Rpb248b2JqZWN0LCBvYmplY3Q+O1xuXG50eXBlIFBhcnNlZEVudmVsb3BlID0gei5pbmZlcjx0eXBlb2YgV2ViU29ja2V0RW52ZWxvcGVTY2hlbWE+O1xuXG50eXBlIFdlYlNvY2tldENvbm5lY3Rpb25PcHRpb25zPFxuICBUT3V0IGV4dGVuZHMgV2ViU29ja2V0RXZlbnRGaWVsZHMsXG4gIFRJbiBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuPiA9IHtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBoZWFydGJlYXQ/OiBudW1iZXI7XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIG91dEV2ZW50czogei5ab2RPYmplY3Q8VE91dD47XG4gIGluRXZlbnRzOiB6LlpvZE9iamVjdDxUSW4+O1xuICByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5PzogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnM7XG59O1xuXG4vLyByZWdpc3RyeeulvCDshozsnKDtlZjqs6AgY29ubmVjdGlvbiDsg53shLEvc2h1dGRvd27snYQg64u064u57ZWoLiBTb25hbXUg7JWg7ZSM66as7LyA7J207IWYIOyImOuqheyjvOq4sOyZgCDqsJnsnbQg7JuA7KeB7J2064+E66GdIOyEpOqzhO2VqFxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFJ1bnRpbWUge1xuICByZWFkb25seSByZWdpc3RyeTogV2ViU29ja2V0UmVnaXN0cnk7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UnVudGltZU9wdGlvbnMgPSB7fSkge1xuICAgIC8vIOu2hOyCsCDtmZjqsr3sl5DshJwg64W465OcIOqwhCDstqnrj4zsnYQg66eJ6riwIOychO2VtCBob3N0bmFtZSArIHBpZOuhnCDrlJTtj7Ttirgg7Iud67OE7J6Q66W8IOunjOuToOuLpC5cbiAgICAvLyDqsJnsnYAg7Zi47Iqk7Yq47JeQIOyXrOufrCDtlITroZzshLjsiqTqsIAg65agIOyeiOyWtOuPhCBwaWTroZwg6rWs67aE65CY66mwLCDroZzqt7gv66mU7Yq466at7JeQ7ISc64+EIOyLneuzhOydtCDsiazsm4BcbiAgICBjb25zdCByZXNvbHZlZE5vZGVJZCA9IG9wdGlvbnMubm9kZUlkID8/IGAke2hvc3RuYW1lKCl9LSR7cHJvY2Vzcy5waWR9YDtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPSBjcmVhdGVXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyKG9wdGlvbnMudGVsZW1ldHJ5LCB7XG4gICAgICBydW50aW1lSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIG5vZGVJZDogcmVzb2x2ZWROb2RlSWQsXG4gICAgfSk7XG4gICAgY29uc3QgcmVnaXN0cnlPcHRpb25zOiBXZWJTb2NrZXRSZWdpc3RyeU9wdGlvbnMgPSB7XG4gICAgICBub2RlSWQ6IHJlc29sdmVkTm9kZUlkLFxuICAgICAgcHJlc2VuY2VTdG9yZTogb3B0aW9ucy5wcmVzZW5jZVN0b3JlLFxuICAgICAgY2x1c3RlckJ1czogb3B0aW9ucy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBXZWJTb2NrZXRSZWdpc3RyeShyZWdpc3RyeU9wdGlvbnMpO1xuICB9XG5cbiAgcmVnaXN0ZXJDb25uZWN0aW9uPFxuICAgIFRPdXRTY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbiAgICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbiAgPihcbiAgICBzb2NrZXQ6IFdlYlNvY2tldFRyYW5zcG9ydCxcbiAgICBvcHRpb25zOiBPbWl0PFxuICAgICAgV2ViU29ja2V0Q29ubmVjdGlvbk9wdGlvbnM8VE91dFNjaGVtYSwgVEluU2NoZW1hPixcbiAgICAgIFwicmVnaXN0cnlcIiB8IFwidGVsZW1ldHJ5Q29udHJvbGxlclwiXG4gICAgPixcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+LCBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRJblNjaGVtYT4+IHtcbiAgICByZXR1cm4gbmV3IFdlYlNvY2tldENvbm5lY3Rpb25JbXBsKHNvY2tldCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgYnJvYWRjYXN0PERhdGE+KGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkuYnJvYWRjYXN0KGV2ZW50LCBkYXRhLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb1Jvb20ocm9vbUlkLCBldmVudCwgZGF0YSwgbmFtZXNwYWNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hUb1VzZXI8RGF0YT4oXG4gICAgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQsXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBkYXRhOiBEYXRhLFxuICAgIG5hbWVzcGFjZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5wdWJsaXNoVG9Vc2VyKHVzZXJJZCwgZXZlbnQsIGRhdGEsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBwdWJsaXNoVG9BdWRpZW5jZTxEYXRhPihhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UsIGV2ZW50OiBzdHJpbmcsIGRhdGE6IERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdHJ5LnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDtlITroZzshLjsiqQg7KKF66OMIOyLnCDsgrTslYTsnojripQg7Jew6rKw7J20IOuCqOyngCDslYrrj4TroZ0gcmVnaXN0cnnrpbwg7Iic7ZqM7ZW0IOydvOq0hCDsooXro4ztlahcbiAgYXN5bmMgc2h1dGRvd24oXG4gICAgY29kZTogbnVtYmVyID0gV1NfQ0xPU0VfQ09ERV9HT0lOR19BV0FZLFxuICAgIHJlYXNvbiA9IFwiU2VydmVyIHNodXR0aW5nIGRvd25cIixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWdpc3RyeS5zaHV0ZG93bihjb2RlLCByZWFzb24pO1xuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5zaHV0ZG93bigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnM6IFdlYlNvY2tldFJ1bnRpbWVPcHRpb25zID0ge30pOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMpO1xufVxuXG5jbGFzcyBXZWJTb2NrZXRDb25uZWN0aW9uSW1wbDxcbiAgVE91dFNjaGVtYSBleHRlbmRzIFdlYlNvY2tldEV2ZW50RmllbGRzLFxuICBUSW5TY2hlbWEgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudEZpZWxkcyxcbj5cbiAgaW1wbGVtZW50c1xuICAgIFdlYlNvY2tldENvbm5lY3Rpb248SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUT3V0U2NoZW1hPiwgSW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+PixcbiAgICBUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24sXG4gICAgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyXG57XG4gIHJlYWRvbmx5IGlkID0gcmFuZG9tVVVJRCgpO1xuICByZWFkb25seSB0cmFuc3BvcnQgPSBcIndzXCI7XG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VDYWxsYmFja3M6IENsb3NlSGFuZGxlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PE1lc3NhZ2VIYW5kbGVyPHVua25vd24+Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nTWVzc2FnZXM6IFBhcnNlZEVudmVsb3BlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogQXJyYXk8eyBwYXlsb2FkOiBzdHJpbmc7IGV2ZW50OiBzdHJpbmcgfT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZVByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZUNsb3NlUHJvbWlzZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFydGJlYXRNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2NoZW1hc0luOiBSZWNvcmQ8c3RyaW5nLCB6LlpvZFR5cGVBbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2NoZW1hc091dDogUmVjb3JkPHN0cmluZywgei5ab2RUeXBlQW55PjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25UcmFjZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TcGFuSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uU2FtcGxlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIC8vIGNvbm5lY3Rpb24g7IiY66qFIOuPmeyViCDsnKDsp4DrkJjripQg7Iud67OE7J6QLiBzZXRVc2VySWQvY2xlYXJVc2VySWTroZwg7JeF642w7J207Yq465CY66mwIGVtaXQgaG90IHBhdGjsl5DshJwg66ek67KIIHJlZ2lzdHJ5IGxvb2t1cO2VmOyngCDslYrrj4TroZ0g7LqQ7Iuc7ZWoXG4gIHByaXZhdGUgY3VycmVudFVzZXJJZD86IHN0cmluZztcblxuICBnZXQgdXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhd2FpdGluZ1BvbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBoZWFydGJlYXRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgb3V0Ym91bmRGbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc29ja2V0OiBXZWJTb2NrZXRUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBXZWJTb2NrZXRDb25uZWN0aW9uT3B0aW9uczxUT3V0U2NoZW1hLCBUSW5TY2hlbWE+LFxuICApIHtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG9wdGlvbnMubmFtZXNwYWNlID8/IFwiZGVmYXVsdFwiO1xuICAgIHRoaXMuaGVhcnRiZWF0TXMgPSBvcHRpb25zLmhlYXJ0YmVhdCA/PyAzMDAwMDtcbiAgICB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkID0gb3B0aW9ucy50cmFjZUlkO1xuICAgIHRoaXMuY29ubmVjdGlvblNwYW5JZCA9IG9wdGlvbnMuc3BhbklkO1xuICAgIHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCA9IG9wdGlvbnMucGFyZW50U3BhbklkO1xuICAgIHRoaXMuY29ubmVjdGlvblNhbXBsZWQgPSBvcHRpb25zLnNhbXBsZWQ7XG4gICAgdGhpcy5ldmVudFNjaGVtYXNJbiA9IG9wdGlvbnMuaW5FdmVudHNbXCJzaGFwZVwiXTtcbiAgICB0aGlzLmV2ZW50U2NoZW1hc091dCA9IG9wdGlvbnMub3V0RXZlbnRzW1wic2hhcGVcIl07XG5cbiAgICBsZXQgcmVzb2x2ZUNsb3NlUHJvbWlzZSE6ICgpID0+IHZvaWQ7XG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVzb2x2ZUNsb3NlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlID0gcmVzb2x2ZUNsb3NlUHJvbWlzZTtcblxuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLCBvcHRpb25zLmFjdGl2ZSA/PyB0cnVlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgdGhpcy5oYW5kbGVNZXNzYWdlKTtcbiAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5oYW5kbGVFcnJvcik7XG4gICAgdGhpcy5zb2NrZXQub24oXCJwb25nXCIsIHRoaXMuaGFuZGxlUG9uZyk7XG4gICAgdGhpcy5zdGFydEhlYXJ0YmVhdCgpO1xuICB9XG5cbiAgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZWRJbnRlcm5hbDtcbiAgfVxuXG4gIG9uQ2xvc2UoY2FsbGJhY2s6IENsb3NlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIEluZmVyV2ViU29ja2V0RXZlbnRNYXA8VEluU2NoZW1hPj4oXG4gICAgZXZlbnQ6IEssXG4gICAgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8SW5mZXJXZWJTb2NrZXRFdmVudE1hcDxUSW5TY2hlbWE+W0tdPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBTdHJpbmcoZXZlbnQpO1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnMuZ2V0KGV2ZW50S2V5KSA/PyBbXTtcbiAgICBoYW5kbGVycy5wdXNoKFxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBoYW5kbGVyIGFzIE1lc3NhZ2VIYW5kbGVyPHVua25vd24+LFxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMuc2V0KGV2ZW50S2V5LCBoYW5kbGVycyk7XG4gICAgdGhpcy5mbHVzaFBlbmRpbmdNZXNzYWdlcyhldmVudEtleSk7XG4gIH1cblxuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+PihcbiAgICBldmVudDogSyxcbiAgICBkYXRhOiBJbmZlcldlYlNvY2tldEV2ZW50TWFwPFRPdXRTY2hlbWE+W0tdLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnB1Ymxpc2hWYWxpZGF0ZWQoU3RyaW5nKGV2ZW50KSwgZGF0YSk7XG4gIH1cblxuICBwdWJsaXNoVW50eXBlZDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVmFsaWRhdGVkKGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIHdhaXRGb3JDbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZVByb21pc2U7XG4gIH1cblxuICBqb2luKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmpvaW4odGhpcy5pZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmxlYXZlKHRoaXMuaWQsIHJvb21JZCk7XG4gIH1cblxuICBzZXRVc2VySWQodXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSBTdHJpbmcodXNlcklkKTtcbiAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkuc2V0VXNlcklkKHRoaXMuaWQsIHVzZXJJZCk7XG4gIH1cblxuICBjbGVhclVzZXJJZCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VySWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vcHRpb25zLnJlZ2lzdHJ5LmNsZWFyVXNlcklkKHRoaXMuaWQpO1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogdGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoLFxuICAgICAgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoLFxuICAgICAgc29ja2V0QnVmZmVyZWRCeXRlczogdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiA/IHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50IDogMCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5Q29udGV4dCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNlSWQ6IHRoaXMuY29ubmVjdGlvblRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IHRoaXMuY29ubmVjdGlvblNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdGhpcy5jb25uZWN0aW9uUGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5jb25uZWN0aW9uU2FtcGxlZCxcbiAgICB9O1xuICB9XG5cbiAgLy8g66qo65OgIHRlbGVtZXRyeSBlbWl0IHNpdGXqsIAg6rO17Jyg7ZWY64qUIGNvbm5lY3Rpb24tbGV2ZWwgZmllbGQg66y27J2MLlxuICAvLyDtlqXtm4QgY29ubmVjdGlvbi1zY29wZWQg7Iud67OE7J6QKGUuZy4gdGVuYW50SWQp6rCAIOy2lOqwgOuQoCDrlYwg7ZWcIOqzs+unjCDshpDrjIDrqbQg65CoXG4gIHByaXZhdGUgdGVsZW1ldHJ5RmllbGRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0aW9uSWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lc3BhY2U6IHRoaXMubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiB0aGlzLmN1cnJlbnRVc2VySWQsXG4gICAgICB0cmFjZUlkOiB0aGlzLmNvbm5lY3Rpb25UcmFjZUlkLFxuICAgICAgc3BhbklkOiB0aGlzLmNvbm5lY3Rpb25TcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEluYm91bmRSZWplY3RlZChyZWFzb246IHN0cmluZywgZXZlbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLnJlamVjdGVkXCIsXG4gICAgICBsZXZlbDogXCJ3YXJuXCIsXG4gICAgICAuLi5maWVsZHMsXG4gICAgICBkZXRhaWw6IGV2ZW50ICE9PSB1bmRlZmluZWQgPyB7IHJlYXNvbiwgZXZlbnQgfSA6IHsgcmVhc29uIH0sXG4gICAgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgIG5hbWU6IFwic29uYW11LndzLm1lc3NhZ2VzXCIsXG4gICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgIHZhbHVlOiAxLFxuICAgICAgdW5pdDogXCIxXCIsXG4gICAgICB0YWdzOiB7IGRpcmVjdGlvbjogXCJpbmJvdW5kXCIsIG91dGNvbWU6IFwicmVqZWN0ZWRcIiB9LFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gdHJhbnNwb3J0IOyiheujjCDrj4TspJEg7JiI7Jm46rCAIOuCmOuPhCBtYXJrQ2xvc2Vk6rCAIOuwmOuTnOyLnCDsi6TtlonrkJjrj4TroZ0gdHJ5L2ZpbmFsbHnroZwg6rCQ7IyIXG4gIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuY2xvc2VTdGFydGVkIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdTX0NMT1NFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xvc2VTdGFydGVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbG9zZVRyYW5zcG9ydChjb2RlLCByZWFzb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtDbG9zZWQoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wg66mU7Iuc7KeA66W8IOyInOywqCDsspjrpqwg7YGQ7JeQIOyYrOumvC4gU29uYW11IGVudmVsb3BlIOqygOymnSDsiJjtlolcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVNZXNzYWdlID0gKHJhdzogUmF3RGF0YSkgPT4ge1xuICAgIHRoaXMuZW5xdWV1ZU1lc3NhZ2VUYXNrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBub3JtYWxpemVNZXNzYWdlKHJhdyk7XG4gICAgICBjb25zdCBwYXJzZWRFbnZlbG9wZSA9IHNhZmVQYXJzZUVudmVsb3BlKHRleHQpO1xuICAgICAgaWYgKCFwYXJzZWRFbnZlbG9wZSkge1xuICAgICAgICB0aGlzLmVtaXRJbmJvdW5kUmVqZWN0ZWQoXCJpbnZhbGlkUGF5bG9hZFwiKTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVkFMSURfRlJBTUVfUEFZTE9BRF9EQVRBLCBcIkludmFsaWQgbWVzc2FnZSBwYXlsb2FkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UucmVjZWl2ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBwYXJzZWRFbnZlbG9wZS5ldmVudCB9LFxuICAgICAgICBwYXlsb2FkOiBwYXJzZWRFbnZlbG9wZS5kYXRhLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9wdGlvbnMucmVnaXN0cnkudG91Y2godGhpcy5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoRW52ZWxvcGUocGFyc2VkRW52ZWxvcGUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlQ2xvc2UgPSAoY29kZT86IG51bWJlciwgcmVhc29uPzogQnVmZmVyIHwgc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVhc29uVGV4dCA9IGlzU3RyaW5nVmFsdWUocmVhc29uKSA/IHJlYXNvbiA6IHJlYXNvbj8udG9TdHJpbmcoKTtcbiAgICB0aGlzLm1hcmtDbG9zZWQoY29kZSwgcmVhc29uVGV4dCk7XG4gIH07XG5cbiAgLy8g7IaM7LyT7J20IHRyYW5zcG9ydCBlcnJvcuulvCBlbWl07ZWY66m0IOymieyLnCAxMDExIGNsb3Nl66GcIOyImOugtOyLnOy8nCDsg4Htg5wg64iE65297J2EIOunieydjFxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUVycm9yID0gKCkgPT4ge1xuICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9JTlRFUk5BTF9FUlJPUiwgXCJXZWJTb2NrZXQgdHJhbnNwb3J0IGVycm9yXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlUG9uZyA9ICgpID0+IHtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS50b3VjaCh0aGlzLmlkKTtcbiAgfTtcblxuICAvLyBlbnZlbG9wZeydmCBtZXRhLnRyYWNlcGFyZW5066Gc67aA7YSwIHRyYWNlIGNvbnRleHTrpbwg7LaU7Lac7ZWoXG4gIC8vIGludmFsaWQgdHJhY2VwYXJlbnTripQg7Jew6rKw7J2EIOqxsOu2gO2VmOyngCDslYrqs6AgZGVidWcg66CI67KoIOqyveqzoOunjCBlbWl07ZWoXG4gIHByaXZhdGUgcmVzb2x2ZU1lc3NhZ2VUcmFjZUNvbnRleHQoXG4gICAgZW52ZWxvcGU6IFBhcnNlZEVudmVsb3BlLFxuICApOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgY29uc3QgbWVzc2FnZVNwYW5JZCA9IGdlbmVyYXRlU3BhbklkKCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5wcm9wYWdhdGVNZXNzYWdlVHJhY2UgJiZcbiAgICAgIGVudmVsb3BlLm1ldGE/LnRyYWNlcGFyZW50XG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVRyYWNlUGFyZW50KGVudmVsb3BlLm1ldGEudHJhY2VwYXJlbnQpO1xuICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgIHNwYW5JZDogbWVzc2FnZVNwYW5JZCxcbiAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICBzYW1wbGVkOiBwYXJzZWQuc2FtcGxlZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGludmFsaWQgdHJhY2VwYXJlbnQ6IHdhcm4gYnV0IGRvIG5vdCByZWplY3RcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnRyYWNlLmludmFsaWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IHNvdXJjZTogXCJtZXNzYWdlXCIsIHRyYWNlcGFyZW50OiBlbnZlbG9wZS5tZXRhLnRyYWNlcGFyZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2VJZDogdGhpcy5jb25uZWN0aW9uVHJhY2VJZCxcbiAgICAgIHNwYW5JZDogbWVzc2FnZVNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogdGhpcy5jb25uZWN0aW9uU3BhbklkID8/IHRoaXMuY29ubmVjdGlvblBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuY29ubmVjdGlvblNhbXBsZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGV2ZW50IOyhtOyerCDsl6zrtoAg4oaSIHNjaGVtYSDqsoDspp0g4oaSIGhhbmRsZXIg7Iuk7ZaJIOyInOycvOuhnCDrtoTquLDtlahcbiAgLy8gaGFuZGxlcuqwgCDslYTsp4Eg65Ox66Gd65CY7KeAIOyViuydgCDstIjquLAg66mU7Iuc7KeA64qUIOuyhO2NvOyXkCDrs7TqtIDtlojri6TqsIAgb25NZXNzYWdlIOuTseuhnSDsi5wgZmx1c2jtlahcbiAgLy8gaGFuZGxlcuuKlCBgYXdhaXRg7Jy866GcIOyInOywqCDsi6TtlontlbQg7ZWcIGNvbm5lY3Rpb24g7JWI7J2YIOuplOyLnOyngCDsiJzshJzrpbwg67O07J6l7ZWoXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbnZlbG9wZShlbnZlbG9wZTogUGFyc2VkRW52ZWxvcGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzLmdldChlbnZlbG9wZS5ldmVudCk7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5ldmVudFNjaGVtYXNJbltlbnZlbG9wZS5ldmVudF07XG5cbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgdGhpcy5lbWl0SW5ib3VuZFJlamVjdGVkKFwidW5rbm93bkV2ZW50XCIsIGVudmVsb3BlLmV2ZW50KTtcbiAgICAgIHRoaXMuY2xvc2UoV1NfQ0xPU0VfQ09ERV9QT0xJQ1lfVklPTEFUSU9OLCBcIlVua25vd24gZXZlbnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShlbnZlbG9wZS5kYXRhKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLmVtaXRJbmJvdW5kUmVqZWN0ZWQoXCJpbnZhbGlkRGF0YVwiLCBlbnZlbG9wZS5ldmVudCk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5WQUxJRF9GUkFNRV9QQVlMT0FEX0RBVEEsIFwiSW52YWxpZCBldmVudCBkYXRhXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaGFuZGxlcnMgfHwgaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nTWVzc2FnZXMubGVuZ3RoID49IE1BWF9QRU5ESU5HX01FU1NBR0VTKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MubWVzc2FnZS5idWZmZXIuZHJvcHBlZFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudDogZW52ZWxvcGUuZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5wdXNoKGVudmVsb3BlKTtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuYnVmZmVyZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2VDdHggPSB0aGlzLnJlc29sdmVNZXNzYWdlVHJhY2VDb250ZXh0KGVudmVsb3BlKTtcbiAgICAvLyBtZXNzYWdlLWxldmVsIHRyYWNl64qUIGNvbm5lY3Rpb24tbGV2ZWwgdHJhY2Xrpbwgb3ZlcnJpZGXtlaguIHVzZXJJZCAvIGNvbm5lY3Rpb25JZCAvIG5hbWVzcGFjZeuKlCDqt7jrjIDroZwg7Jyg7KeAXG4gICAgY29uc3QgbWVzc2FnZVRyYWNlRmllbGRzID0ge1xuICAgICAgY29ubmVjdGlvbklkOiB0aGlzLmlkLFxuICAgICAgbmFtZXNwYWNlOiB0aGlzLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogdGhpcy5jdXJyZW50VXNlcklkLFxuICAgICAgdHJhY2VJZDogdHJhY2VDdHgudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogdHJhY2VDdHguc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUN0eC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiB0cmFjZUN0eC5zYW1wbGVkLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICBhd2FpdCBoYW5kbGVyKHBhcnNlZC5kYXRhLCB0cmFjZUN0eCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5tZXNzYWdlLmRpc3BhdGNoZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgLi4ubWVzc2FnZVRyYWNlRmllbGRzLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGVudmVsb3BlLmV2ZW50IH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICAgIG5hbWU6IFwic29uYW11LndzLm1lc3NhZ2VzXCIsXG4gICAgICAgIGtpbmQ6IFwiY291bnRlclwiLFxuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHRhZ3M6IHsgZGlyZWN0aW9uOiBcImluYm91bmRcIiwgZXZlbnQ6IGVudmVsb3BlLmV2ZW50LCBvdXRjb21lOiBcImFjY2VwdGVkXCIgfSxcbiAgICAgICAgLi4ubWVzc2FnZVRyYWNlRmllbGRzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLm1lc3NhZ2UuZmFpbGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLm1lc3NhZ2VUcmFjZUZpZWxkcyxcbiAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBlbnZlbG9wZS5ldmVudCB9LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZsdXNoUGVuZGluZ01lc3NhZ2VzKGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZW1haW5pbmc6IFBhcnNlZEVudmVsb3BlW10gPSBbXTtcbiAgICBjb25zdCB0b0ZsdXNoOiBQYXJzZWRFbnZlbG9wZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5wZW5kaW5nTWVzc2FnZXMpIHtcbiAgICAgIGlmIChtZXNzYWdlLmV2ZW50ICE9PSBldmVudCkge1xuICAgICAgICByZW1haW5pbmcucHVzaChtZXNzYWdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvRmx1c2gucHVzaChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLnB1c2goLi4ucmVtYWluaW5nKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0b0ZsdXNoKSB7XG4gICAgICB0aGlzLmVucXVldWVNZXNzYWdlVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hFbnZlbG9wZShtZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHVibGlzaFZhbGlkYXRlZDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5ldmVudFNjaGVtYXNPdXRbZXZlbnRdO1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcInVua25vd25FdmVudFwiIH0sXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgZXZlbnQ6ICR7ZXZlbnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5wdWJsaXNoLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgIC4uLnRoaXMudGVsZW1ldHJ5RmllbGRzKCksXG4gICAgICAgIGRldGFpbDogeyBldmVudCwgcmVhc29uOiBcImludmFsaWRQYXlsb2FkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdlYnNvY2tldCBldmVudCBwYXlsb2FkOiAke2V2ZW50fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guZHJvcHBlZFwiLFxuICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICBkZXRhaWw6IHsgZXZlbnQsIHJlYXNvbjogXCJjb25uZWN0aW9uQ2xvc2VkXCIgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGRhdGE6IHBhcnNlZC5kYXRhLFxuICAgICAgfSksXG4gICAgICBldmVudCxcbiAgICApO1xuICB9XG5cbiAgLy8gbGlzdGVuZXIg7ZW07KCcIC8gaGVhcnRiZWF0IOykkeuLqCAvIHBlbmRpbmcgcXVldWUg67mE7JuAIC8gcmVnaXN0cnkgdW5yZWdpc3RlciAvIG9uQ2xvc2Ug7Iuk7ZaJIC8gd2FpdEZvckNsb3NlIHJlc29sdmUg7J2EIO2VnCDqs7Psl5Ag66qo7JWEIOybkOyekOyggeycvOuhnCDsspjrpqztlahcbiAgLy8gYXN5bmMgb25DbG9zZeqwgCByZWplY3TtlbTrj4QgdW5oYW5kbGVkIHJlamVjdGlvbuycvOuhnCDsg4jsp4Ag7JWK64+E66GdIGNhdGNo66GcIOqyqeumrO2VqFxuICBwcml2YXRlIG1hcmtDbG9zZWQoY29kZT86IG51bWJlciwgX3JlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXQoKTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmNsb3NlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgLi4uZmllbGRzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5nZXRUcmFjZU9wdGlvbnMoKS5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRTcGFuKHtcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5jb25uZWN0aW9uLmxpZmV0aW1lXCIsXG4gICAgICAgIGtpbmQ6IFwic2VydmVyXCIsXG4gICAgICAgIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5jb25uZWN0aW9uU3RhcnRlZEF0LFxuICAgICAgICBzdGF0dXM6IGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGUpLFxuICAgICAgICAuLi5maWVsZHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQub2ZmKFwibWVzc2FnZVwiLCB0aGlzLmhhbmRsZU1lc3NhZ2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImNsb3NlXCIsIHRoaXMuaGFuZGxlQ2xvc2UpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcImVycm9yXCIsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIHRoaXMuc29ja2V0Lm9mZihcInBvbmdcIiwgdGhpcy5oYW5kbGVQb25nKTtcbiAgICB0aGlzLmF3YWl0aW5nUG9uZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ01lc3NhZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMub3B0aW9ucy5yZWdpc3RyeS51bnJlZ2lzdGVyKHRoaXMuaWQpO1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jbG9zZUNhbGxiYWNrcy5zcGxpY2UoMCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBhc3luYyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgZXNjYXBlIGFzIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjbG9zZSBjYWxsYmFja3MgbXVzdCBub3QgYmxvY2sgdHJhbnNwb3J0IGNsZWFudXBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlQ2xvc2VQcm9taXNlKCk7XG4gIH1cblxuICAvLyBwb25n7J20IOyYpOyngCDslYrsnYAg7IOB7YOc7JeQ7IScIOuLpOydjCB0aWNr7J20IOyYpOuptCB0aW1lb3V0IGNsb3Nl66GcIOyymOumrO2VtCB6b21iaWUgY29ubmVjdGlvbuydhCDsoJXrpqztlahcbiAgcHJpdmF0ZSBzdGFydEhlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWFydGJlYXRNcyA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZEludGVybmFsIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdTX09QRU4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hd2FpdGluZ1BvbmcpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgbmFtZTogXCJ3cy5oZWFydGJlYXQudGltZW91dFwiLFxuICAgICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0dPSU5HX0FXQVksIFwiSGVhcnRiZWF0IHRpbWVvdXRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hd2FpdGluZ1BvbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zb2NrZXQucGluZygpO1xuICAgIH0sIHRoaXMuaGVhcnRiZWF0TXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wSGVhcnRiZWF0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oZWFydGJlYXRUaW1lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydGJlYXRUaW1lcik7XG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGw7XG4gIH1cblxuICAvLyBjbG9zZeqwgCDsi6TtjKjtlbTrj4QgdGVybWluYXRlIO2PtOuwseq5jOyngCDsi5zrj4TtlZjqs6AsIOuBneuCtCDsi6TtjKjtlZjrqbQgbWFya0Nsb3NlZOyXkCDsg4Htg5wg7KCV66as66W8IOychOyehO2VqFxuICBwcml2YXRlIGNsb3NlVHJhbnNwb3J0KGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV1NfT1BFTiB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19DT05ORUNUSU5HKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQudGVybWluYXRlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyB0cmFuc3BvcnQgaXMgYWxyZWFkeSBicm9rZW47IHN0YXRlIGNsZWFudXAgaXMgaGFuZGxlZCBieSBtYXJrQ2xvc2VkKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDsnbjrsJTsmrTrk5wgaGFuZGxlcuulvCBwcm9taXNlIGNoYWlu7Jy866GcIHNlcmlhbGl6ZSDtlZjqs6AsIGhhbmRsZXIg7JiI7Jm464qUIGNvbm5lY3Rpb24tbG9jYWwgMTAxMSBjbG9zZeuhnCDstpXshoztlahcbiAgcHJpdmF0ZSBlbnF1ZXVlTWVzc2FnZVRhc2sodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gdGhpcy5tZXNzYWdlUXVldWVcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0YXNrKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZShXU19DTE9TRV9DT0RFX0lOVEVSTkFMX0VSUk9SLCBcIk1lc3NhZ2UgaGFuZGxpbmcgZmFpbGVkXCIpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBxdWV1ZeqwgCDtlZzqs4Tsl5Ag64+E64us7ZWY66m0IDEwMTPsnLzroZwg64ur7JWEIOuKkOumsCDshozruYTsnpDqsIAg66mU66qo66as66W8IOuBneyXhuydtCDsnqHslYTrqLnsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyB0ZWxlbWV0cnkgcHJldmlld+uKlCDsp4HroKztmZTrkJwgcGF5bG9hZOyXkOyEnCDrs7Xsm5DtlbQg7KCE7IahIOuNsOydtO2EsOyZgCDqsJnsnYAgSlNPTiDqs4Tslb3snYQg7Jyg7KeA7ZWoXG4gIHByaXZhdGUgZW5xdWV1ZU91dGJvdW5kTWVzc2FnZShwYXlsb2FkOiBzdHJpbmcsIGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPj0gTUFYX1BFTkRJTkdfT1VUQk9VTkRfTUVTU0FHRVMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5vdmVyZmxvd1wiLFxuICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAuLi50aGlzLnRlbGVtZXRyeUZpZWxkcygpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfVFJZX0FHQUlOX0xBVEVSLCBcIldlYlNvY2tldCBiYWNrcHJlc3N1cmUgb3ZlcmZsb3dcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5wdXNoKHsgcGF5bG9hZCwgZXZlbnQgfSk7XG4gICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLnB1Ymxpc2gucXVldWVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgcGF5bG9hZDogc2FmZVBhcnNlRW52ZWxvcGUocGF5bG9hZCk/LmRhdGEsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPdXRib3VuZEZsdXNoKGRlbGF5TXM6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkIHx8IHRoaXMuY2xvc2VkSW50ZXJuYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm91dGJvdW5kRmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgdGhpcy5vdXRib3VuZEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmZsdXNoT3V0Ym91bmRNZXNzYWdlcygpO1xuICAgIH07XG5cbiAgICBpZiAoZGVsYXlNcyA+IDApIHtcbiAgICAgIHNldFRpbWVvdXQoZmx1c2gsIGRlbGF5TXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldEltbWVkaWF0ZShmbHVzaCk7XG4gIH1cblxuICAvLyBidWZmZXJlZEFtb3VudOqwgCDsnoTqs4TsuZjrpbwg64SY7Jy866m0IGZsdXNo66W8IOuvuOukhCBzb2NrZXQg64K067aAIO2BkOqwgCDthLDsp4Dsp4Ag7JWK64+E66GdIGJhY2twcmVzc3VyZeulvCDsobTspJHtlahcbiAgLy8g7ZWcIOuyiOyXkCDrsLDsuZgg64uo7JyE66Gc66eMIHNlbmTtlbQg64+Z6riwIOujqO2UhOqwgCDsnbTrsqTtirgg66Oo7ZSE66W8IOyepeyLnOqwhCDsoJDsnKDtlZjsp4Ag7JWK6rKMIO2VqFxuICBwcml2YXRlIGZsdXNoT3V0Ym91bmRNZXNzYWdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWRJbnRlcm5hbCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSBXU19PUEVOKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmJhY2twcmVzc3VyZS5kZWxheWVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgLi4udGhpcy50ZWxlbWV0cnlGaWVsZHMoKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goT1VUQk9VTkRfUkVUUllfREVMQVlfTVMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZW50ID0gMDtcbiAgICB3aGlsZSAoXG4gICAgICBzZW50IDwgT1VUQk9VTkRfQkFUQ0hfU0laRSAmJlxuICAgICAgdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXU19PUEVOXG4gICAgKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcy5zaGlmdCgpO1xuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXlsb2FkLCBldmVudCB9ID0gbmV4dDtcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnRlbGVtZXRyeUZpZWxkcygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChwYXlsb2FkKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgICBuYW1lOiBcIndzLnB1Ymxpc2guc2VudFwiLFxuICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGRldGFpbDogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkU3Bhbih7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5wdWJsaXNoLnNlbmRcIixcbiAgICAgICAgICBraW5kOiBcInByb2R1Y2VyXCIsXG4gICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgYXR0cmlidXRlczogeyBldmVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgICBuYW1lOiBcInNvbmFtdS53cy5wdWJsaXNoZXNcIixcbiAgICAgICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgICB0YWdzOiB7IG91dGNvbWU6IFwic2VudFwiLCBldmVudCB9LFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgIG5hbWU6IFwid3MucHVibGlzaC5mYWlsZWRcIixcbiAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgIC4uLmZpZWxkcyxcbiAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZFNwYW4oe1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MucHVibGlzaC5zZW5kXCIsXG4gICAgICAgICAga2luZDogXCJwcm9kdWNlclwiLFxuICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQgfSxcbiAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogcnVudGltZVR5cGVPZihlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb3NlKFdTX0NMT1NFX0NPREVfSU5URVJOQUxfRVJST1IsIFwiT3V0Ym91bmQgcHVibGlzaCBmYWlsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VudCArPSAxO1xuICAgICAgaWYgKHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ091dGJvdW5kTWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZU91dGJvdW5kRmx1c2goXG4gICAgICAgIHRoaXMuc29ja2V0LmJ1ZmZlcmVkQW1vdW50ID4gTUFYX1NPQ0tFVF9CVUZGRVJFRF9BTU9VTlQgPyBPVVRCT1VORF9SRVRSWV9ERUxBWV9NUyA6IDAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXNzYWdlKHJhdzogUmF3RGF0YSk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiByYXcudG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIGlmIChyYXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShyYXcpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmF3LmZpbHRlcigoY2h1bmspOiBjaHVuayBpcyBCdWZmZXIgPT4gY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpKS50b1N0cmluZyhcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJhdyk7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZUVudmVsb3BlKHJhdzogc3RyaW5nKTogUGFyc2VkRW52ZWxvcGUgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPVxuICAgICAgLyogU0FGRVRZOiDrk7HroZ3rkJwgV2ViU29ja2V0IOydtOuypO2KuCDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgICAgICByYXcsXG4gICAgICApIGFzIHVua25vd247XG4gICAgY29uc3QgdmFsaWRhdGVkID0gV2ViU29ja2V0RW52ZWxvcGVTY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZC5zdWNjZXNzID8gdmFsaWRhdGVkLmRhdGEgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBSRkMgNjQ1NeqwgCBjbG9zZSBmcmFtZSByZWFzb27snYQgMTIzIGJ5dGXroZwg7KCc7ZWc7ZWY66+A66GcIOy0iOqzvOu2hOydgCDsnpjrnbwg7KCE7IahIOyLpO2MqOulvCDrsKnsp4DtlahcbmZ1bmN0aW9uIHRydW5jYXRlQ2xvc2VSZWFzb24ocmVhc29uPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZWFzb24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgXCJ1dGYtOFwiKSA8PSAxMjNcbiAgICA/IHJlYXNvblxuICAgIDogQnVmZmVyLmZyb20ocmVhc29uKS5zdWJhcnJheSgwLCAxMjMpLnRvU3RyaW5nKFwidXRmLThcIik7XG59XG5cbi8vIGNvbm5lY3Rpb24gbGlmZXRpbWUgc3BhbuydmCBzdGF0dXPrpbwgY2xvc2UgY29kZSDquLDspIDsnLzroZwg67aE6riw7ZWoICgxMDAwLzEwMDEg7KCV7IOBIOyiheujjCwg6re4IOyZuCBrbm93biBjb2RlIGVycm9yLCBjb2RlIOuvuOyDgeydgCB1bnNldClcbmZ1bmN0aW9uIGRlcml2ZUxpZmV0aW1lU3RhdHVzKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCk6IFwib2tcIiB8IFwiZXJyb3JcIiB8IFwidW5zZXRcIiB7XG4gIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVuc2V0XCI7XG4gIGlmIChjb2RlID09PSAxMDAwIHx8IGNvZGUgPT09IDEwMDEpIHJldHVybiBcIm9rXCI7XG4gIHJldHVybiBcImVycm9yXCI7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFrTkEsU0FBZ0IsdUJBQXVCLFVBQW1DLENBQUMsR0FBcUI7Q0FDOUYsT0FBTyxJQUFJLGlCQUFpQixPQUFPO0FBQ3JDO0FBbXBCQSxTQUFTLGlCQUFpQixLQUFzQjtDQUM5QyxJQUFJLGNB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