velocious 1.0.428 → 1.0.429

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 (933) hide show
  1. package/README.md +2 -0
  2. package/build/src/application.d.ts +96 -9
  3. package/build/src/application.d.ts.map +1 -1
  4. package/build/src/application.js +127 -28
  5. package/build/src/authorization/ability.d.ts +72 -31
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +59 -22
  8. package/build/src/authorization/base-resource.d.ts +47 -20
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +43 -14
  11. package/build/src/background-jobs/client.d.ts +4 -2
  12. package/build/src/background-jobs/client.d.ts.map +1 -1
  13. package/build/src/background-jobs/client.js +4 -2
  14. package/build/src/background-jobs/cron-expression.d.ts +9 -5
  15. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  16. package/build/src/background-jobs/cron-expression.js +16 -6
  17. package/build/src/background-jobs/forked-runner-child.js +12 -5
  18. package/build/src/background-jobs/job-registry.d.ts +7 -1
  19. package/build/src/background-jobs/job-registry.d.ts.map +1 -1
  20. package/build/src/background-jobs/job-registry.js +8 -2
  21. package/build/src/background-jobs/job-runner.d.ts +1 -0
  22. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  23. package/build/src/background-jobs/job-runner.js +8 -3
  24. package/build/src/background-jobs/job.d.ts +12 -8
  25. package/build/src/background-jobs/job.d.ts.map +1 -1
  26. package/build/src/background-jobs/job.js +12 -6
  27. package/build/src/background-jobs/json-socket.d.ts +17 -5
  28. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  29. package/build/src/background-jobs/json-socket.js +18 -6
  30. package/build/src/background-jobs/main.d.ts +118 -32
  31. package/build/src/background-jobs/main.d.ts.map +1 -1
  32. package/build/src/background-jobs/main.js +123 -35
  33. package/build/src/background-jobs/normalize-error.d.ts +2 -1
  34. package/build/src/background-jobs/normalize-error.d.ts.map +1 -1
  35. package/build/src/background-jobs/normalize-error.js +5 -3
  36. package/build/src/background-jobs/scheduler.d.ts +31 -10
  37. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  38. package/build/src/background-jobs/scheduler.js +33 -11
  39. package/build/src/background-jobs/socket-request.d.ts +2 -0
  40. package/build/src/background-jobs/socket-request.d.ts.map +1 -1
  41. package/build/src/background-jobs/socket-request.js +11 -3
  42. package/build/src/background-jobs/status-reporter.d.ts +5 -2
  43. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  44. package/build/src/background-jobs/status-reporter.js +6 -3
  45. package/build/src/background-jobs/store.d.ts +57 -19
  46. package/build/src/background-jobs/store.d.ts.map +1 -1
  47. package/build/src/background-jobs/store.js +70 -20
  48. package/build/src/background-jobs/types.d.ts +7 -7
  49. package/build/src/background-jobs/types.d.ts.map +1 -1
  50. package/build/src/background-jobs/types.js +6 -6
  51. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  52. package/build/src/background-jobs/web/authorization.js +3 -1
  53. package/build/src/background-jobs/web/controller.d.ts +40 -14
  54. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  55. package/build/src/background-jobs/web/controller.js +46 -15
  56. package/build/src/background-jobs/web/registry.d.ts +5 -0
  57. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  58. package/build/src/background-jobs/web/registry.js +4 -1
  59. package/build/src/background-jobs/worker.d.ts +41 -8
  60. package/build/src/background-jobs/worker.d.ts.map +1 -1
  61. package/build/src/background-jobs/worker.js +64 -16
  62. package/build/src/beacon/client.d.ts +39 -12
  63. package/build/src/beacon/client.d.ts.map +1 -1
  64. package/build/src/beacon/client.js +45 -15
  65. package/build/src/beacon/in-process-broker.d.ts +4 -0
  66. package/build/src/beacon/in-process-broker.d.ts.map +1 -1
  67. package/build/src/beacon/in-process-broker.js +8 -3
  68. package/build/src/beacon/in-process-client.d.ts +28 -9
  69. package/build/src/beacon/in-process-client.d.ts.map +1 -1
  70. package/build/src/beacon/in-process-client.js +27 -9
  71. package/build/src/beacon/server.d.ts +13 -2
  72. package/build/src/beacon/server.d.ts.map +1 -1
  73. package/build/src/beacon/server.js +21 -5
  74. package/build/src/beacon/types.d.ts +3 -3
  75. package/build/src/beacon/types.d.ts.map +1 -1
  76. package/build/src/beacon/types.js +2 -2
  77. package/build/src/cli/base-command.d.ts +18 -4
  78. package/build/src/cli/base-command.d.ts.map +1 -1
  79. package/build/src/cli/base-command.js +15 -4
  80. package/build/src/cli/browser-cli.d.ts +3 -0
  81. package/build/src/cli/browser-cli.d.ts.map +1 -1
  82. package/build/src/cli/browser-cli.js +7 -2
  83. package/build/src/cli/commands/background-jobs-main.d.ts +0 -1
  84. package/build/src/cli/commands/background-jobs-main.d.ts.map +1 -1
  85. package/build/src/cli/commands/background-jobs-runner.d.ts +0 -1
  86. package/build/src/cli/commands/background-jobs-runner.d.ts.map +1 -1
  87. package/build/src/cli/commands/background-jobs-worker.d.ts +0 -1
  88. package/build/src/cli/commands/background-jobs-worker.d.ts.map +1 -1
  89. package/build/src/cli/commands/beacon.d.ts +0 -1
  90. package/build/src/cli/commands/beacon.d.ts.map +1 -1
  91. package/build/src/cli/commands/console.d.ts +0 -2
  92. package/build/src/cli/commands/console.d.ts.map +1 -1
  93. package/build/src/cli/commands/console.js +5 -2
  94. package/build/src/cli/commands/db/base-command.d.ts +11 -2
  95. package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
  96. package/build/src/cli/commands/db/base-command.js +12 -3
  97. package/build/src/cli/commands/db/create.d.ts +3 -0
  98. package/build/src/cli/commands/db/create.d.ts.map +1 -1
  99. package/build/src/cli/commands/db/create.js +4 -1
  100. package/build/src/cli/commands/db/drop.d.ts +3 -0
  101. package/build/src/cli/commands/db/drop.d.ts.map +1 -1
  102. package/build/src/cli/commands/db/drop.js +4 -1
  103. package/build/src/cli/commands/db/schema/dump.d.ts +0 -2
  104. package/build/src/cli/commands/db/schema/dump.d.ts.map +1 -1
  105. package/build/src/cli/commands/db/schema/dump.js +5 -2
  106. package/build/src/cli/commands/db/schema/load.d.ts +0 -2
  107. package/build/src/cli/commands/db/schema/load.d.ts.map +1 -1
  108. package/build/src/cli/commands/db/schema/load.js +5 -2
  109. package/build/src/cli/commands/db/seed.d.ts +0 -2
  110. package/build/src/cli/commands/db/seed.d.ts.map +1 -1
  111. package/build/src/cli/commands/db/seed.js +5 -2
  112. package/build/src/cli/commands/db/tenants/check.d.ts +4 -1
  113. package/build/src/cli/commands/db/tenants/check.d.ts.map +1 -1
  114. package/build/src/cli/commands/db/tenants/check.js +5 -2
  115. package/build/src/cli/commands/db/tenants/create.d.ts +4 -1
  116. package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
  117. package/build/src/cli/commands/db/tenants/create.js +5 -2
  118. package/build/src/cli/commands/db/tenants/migrate.d.ts +4 -1
  119. package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
  120. package/build/src/cli/commands/db/tenants/migrate.js +5 -2
  121. package/build/src/cli/commands/destroy/migration.d.ts +0 -1
  122. package/build/src/cli/commands/destroy/migration.d.ts.map +1 -1
  123. package/build/src/cli/commands/generate/base-models.d.ts +0 -1
  124. package/build/src/cli/commands/generate/base-models.d.ts.map +1 -1
  125. package/build/src/cli/commands/generate/frontend-models.d.ts +0 -2
  126. package/build/src/cli/commands/generate/frontend-models.d.ts.map +1 -1
  127. package/build/src/cli/commands/generate/frontend-models.js +5 -2
  128. package/build/src/cli/commands/generate/migration.d.ts +0 -1
  129. package/build/src/cli/commands/generate/migration.d.ts.map +1 -1
  130. package/build/src/cli/commands/generate/model.d.ts +0 -1
  131. package/build/src/cli/commands/generate/model.d.ts.map +1 -1
  132. package/build/src/cli/commands/init.d.ts +0 -1
  133. package/build/src/cli/commands/init.d.ts.map +1 -1
  134. package/build/src/cli/commands/routes.d.ts +0 -1
  135. package/build/src/cli/commands/routes.d.ts.map +1 -1
  136. package/build/src/cli/commands/run-script.d.ts +0 -2
  137. package/build/src/cli/commands/run-script.d.ts.map +1 -1
  138. package/build/src/cli/commands/run-script.js +5 -2
  139. package/build/src/cli/commands/runner.d.ts +0 -2
  140. package/build/src/cli/commands/runner.d.ts.map +1 -1
  141. package/build/src/cli/commands/runner.js +5 -2
  142. package/build/src/cli/commands/server.d.ts +0 -1
  143. package/build/src/cli/commands/server.d.ts.map +1 -1
  144. package/build/src/cli/commands/test.d.ts +0 -1
  145. package/build/src/cli/commands/test.d.ts.map +1 -1
  146. package/build/src/cli/index.d.ts +18 -5
  147. package/build/src/cli/index.d.ts.map +1 -1
  148. package/build/src/cli/index.js +25 -8
  149. package/build/src/cli/tenant-database-command-helper.d.ts +24 -9
  150. package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
  151. package/build/src/cli/tenant-database-command-helper.js +30 -11
  152. package/build/src/cli/use-browser-cli.d.ts +1 -0
  153. package/build/src/cli/use-browser-cli.d.ts.map +1 -1
  154. package/build/src/cli/use-browser-cli.js +5 -2
  155. package/build/src/configuration-resolver.d.ts +1 -0
  156. package/build/src/configuration-resolver.d.ts.map +1 -1
  157. package/build/src/configuration-resolver.js +2 -1
  158. package/build/src/configuration-types.d.ts +44 -44
  159. package/build/src/configuration-types.d.ts.map +1 -1
  160. package/build/src/configuration-types.js +27 -27
  161. package/build/src/configuration.d.ts +350 -114
  162. package/build/src/configuration.d.ts.map +1 -1
  163. package/build/src/configuration.js +416 -128
  164. package/build/src/controller.d.ts +67 -18
  165. package/build/src/controller.d.ts.map +1 -1
  166. package/build/src/controller.js +88 -23
  167. package/build/src/current-configuration.d.ts +2 -0
  168. package/build/src/current-configuration.d.ts.map +1 -1
  169. package/build/src/current-configuration.js +6 -2
  170. package/build/src/current.d.ts +16 -9
  171. package/build/src/current.d.ts.map +1 -1
  172. package/build/src/current.js +15 -8
  173. package/build/src/database/annotations-async-hooks.js +13 -6
  174. package/build/src/database/annotations.d.ts +7 -1
  175. package/build/src/database/annotations.d.ts.map +1 -1
  176. package/build/src/database/annotations.js +12 -5
  177. package/build/src/database/drivers/base-column.d.ts +21 -3
  178. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  179. package/build/src/database/drivers/base-column.js +21 -3
  180. package/build/src/database/drivers/base-columns-index.d.ts +9 -0
  181. package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
  182. package/build/src/database/drivers/base-columns-index.js +10 -1
  183. package/build/src/database/drivers/base-foreign-key.d.ts +15 -3
  184. package/build/src/database/drivers/base-foreign-key.d.ts.map +1 -1
  185. package/build/src/database/drivers/base-foreign-key.js +15 -3
  186. package/build/src/database/drivers/base-table.d.ts +16 -3
  187. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  188. package/build/src/database/drivers/base-table.js +16 -3
  189. package/build/src/database/drivers/base.d.ts +174 -37
  190. package/build/src/database/drivers/base.d.ts.map +1 -1
  191. package/build/src/database/drivers/base.js +156 -40
  192. package/build/src/database/drivers/mssql/column.d.ts +3 -2
  193. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  194. package/build/src/database/drivers/mssql/column.js +3 -2
  195. package/build/src/database/drivers/mssql/index.d.ts +5 -6
  196. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  197. package/build/src/database/drivers/mssql/index.js +38 -7
  198. package/build/src/database/drivers/mssql/options.d.ts +1 -0
  199. package/build/src/database/drivers/mssql/options.d.ts.map +1 -1
  200. package/build/src/database/drivers/mssql/options.js +8 -2
  201. package/build/src/database/drivers/mssql/sql/create-database.d.ts +1 -0
  202. package/build/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -1
  203. package/build/src/database/drivers/mssql/sql/create-database.js +2 -1
  204. package/build/src/database/drivers/mssql/sql/drop-database.d.ts.map +1 -1
  205. package/build/src/database/drivers/mssql/sql/drop-database.js +2 -1
  206. package/build/src/database/drivers/mssql/structure-sql.d.ts +5 -2
  207. package/build/src/database/drivers/mssql/structure-sql.d.ts.map +1 -1
  208. package/build/src/database/drivers/mssql/structure-sql.js +5 -2
  209. package/build/src/database/drivers/mssql/table.d.ts +1 -0
  210. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  211. package/build/src/database/drivers/mssql/table.js +9 -4
  212. package/build/src/database/drivers/mysql/column.d.ts +3 -2
  213. package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
  214. package/build/src/database/drivers/mysql/column.js +4 -3
  215. package/build/src/database/drivers/mysql/index.d.ts +11 -3
  216. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  217. package/build/src/database/drivers/mysql/index.js +54 -10
  218. package/build/src/database/drivers/mysql/options.d.ts +1 -0
  219. package/build/src/database/drivers/mysql/options.d.ts.map +1 -1
  220. package/build/src/database/drivers/mysql/options.js +4 -2
  221. package/build/src/database/drivers/mysql/query.d.ts +3 -2
  222. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  223. package/build/src/database/drivers/mysql/query.js +6 -3
  224. package/build/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -1
  225. package/build/src/database/drivers/mysql/sql/create-database.js +3 -1
  226. package/build/src/database/drivers/mysql/structure-sql.d.ts +7 -2
  227. package/build/src/database/drivers/mysql/structure-sql.d.ts.map +1 -1
  228. package/build/src/database/drivers/mysql/structure-sql.js +7 -2
  229. package/build/src/database/drivers/mysql/table.d.ts +1 -0
  230. package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
  231. package/build/src/database/drivers/mysql/table.js +7 -3
  232. package/build/src/database/drivers/pgsql/column.d.ts +3 -2
  233. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  234. package/build/src/database/drivers/pgsql/column.js +3 -2
  235. package/build/src/database/drivers/pgsql/index.d.ts +1 -1
  236. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  237. package/build/src/database/drivers/pgsql/index.js +36 -11
  238. package/build/src/database/drivers/pgsql/options.d.ts +2 -0
  239. package/build/src/database/drivers/pgsql/options.d.ts.map +1 -1
  240. package/build/src/database/drivers/pgsql/options.js +3 -1
  241. package/build/src/database/drivers/pgsql/structure-sql.d.ts +5 -2
  242. package/build/src/database/drivers/pgsql/structure-sql.d.ts.map +1 -1
  243. package/build/src/database/drivers/pgsql/structure-sql.js +5 -2
  244. package/build/src/database/drivers/pgsql/table.d.ts +1 -0
  245. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  246. package/build/src/database/drivers/pgsql/table.js +6 -2
  247. package/build/src/database/drivers/sqlite/base.d.ts +15 -5
  248. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  249. package/build/src/database/drivers/sqlite/base.js +79 -27
  250. package/build/src/database/drivers/sqlite/column.d.ts +3 -2
  251. package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
  252. package/build/src/database/drivers/sqlite/column.js +3 -2
  253. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +4 -2
  254. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  255. package/build/src/database/drivers/sqlite/connection-sql-js.js +4 -2
  256. package/build/src/database/drivers/sqlite/foreign-key.d.ts +3 -2
  257. package/build/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -1
  258. package/build/src/database/drivers/sqlite/foreign-key.js +3 -2
  259. package/build/src/database/drivers/sqlite/index.d.ts +18 -5
  260. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  261. package/build/src/database/drivers/sqlite/index.js +40 -16
  262. package/build/src/database/drivers/sqlite/index.native.d.ts +1 -1
  263. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  264. package/build/src/database/drivers/sqlite/index.native.js +6 -3
  265. package/build/src/database/drivers/sqlite/index.web.d.ts +16 -4
  266. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  267. package/build/src/database/drivers/sqlite/index.web.js +17 -7
  268. package/build/src/database/drivers/sqlite/options.d.ts +2 -0
  269. package/build/src/database/drivers/sqlite/options.d.ts.map +1 -1
  270. package/build/src/database/drivers/sqlite/options.js +3 -1
  271. package/build/src/database/drivers/sqlite/query.d.ts +3 -2
  272. package/build/src/database/drivers/sqlite/query.d.ts.map +1 -1
  273. package/build/src/database/drivers/sqlite/query.js +6 -3
  274. package/build/src/database/drivers/sqlite/query.native.d.ts +2 -2
  275. package/build/src/database/drivers/sqlite/query.native.d.ts.map +1 -1
  276. package/build/src/database/drivers/sqlite/query.native.js +3 -3
  277. package/build/src/database/drivers/sqlite/query.web.d.ts +3 -2
  278. package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
  279. package/build/src/database/drivers/sqlite/query.web.js +6 -3
  280. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  281. package/build/src/database/drivers/sqlite/sql/alter-table.js +9 -3
  282. package/build/src/database/drivers/sqlite/structure-sql.d.ts +2 -0
  283. package/build/src/database/drivers/sqlite/structure-sql.d.ts.map +1 -1
  284. package/build/src/database/drivers/sqlite/structure-sql.js +3 -1
  285. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts +2 -0
  286. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
  287. package/build/src/database/drivers/sqlite/table-rebuilder.js +3 -1
  288. package/build/src/database/drivers/sqlite/table.d.ts +2 -0
  289. package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
  290. package/build/src/database/drivers/sqlite/table.js +14 -4
  291. package/build/src/database/drivers/structure-sql/utils.d.ts +2 -0
  292. package/build/src/database/drivers/structure-sql/utils.d.ts.map +1 -1
  293. package/build/src/database/drivers/structure-sql/utils.js +3 -1
  294. package/build/src/database/handler.d.ts +1 -0
  295. package/build/src/database/handler.d.ts.map +1 -1
  296. package/build/src/database/handler.js +2 -1
  297. package/build/src/database/initializer-from-require-context.d.ts +8 -0
  298. package/build/src/database/initializer-from-require-context.d.ts.map +1 -1
  299. package/build/src/database/initializer-from-require-context.js +4 -1
  300. package/build/src/database/migration/index.d.ts +40 -5
  301. package/build/src/database/migration/index.d.ts.map +1 -1
  302. package/build/src/database/migration/index.js +34 -6
  303. package/build/src/database/migrator/files-finder.d.ts +2 -0
  304. package/build/src/database/migrator/files-finder.d.ts.map +1 -1
  305. package/build/src/database/migrator/files-finder.js +6 -2
  306. package/build/src/database/migrator.d.ts +29 -4
  307. package/build/src/database/migrator.d.ts.map +1 -1
  308. package/build/src/database/migrator.js +45 -10
  309. package/build/src/database/pool/async-tracked-multi-connection.d.ts +125 -31
  310. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  311. package/build/src/database/pool/async-tracked-multi-connection.js +189 -52
  312. package/build/src/database/pool/base-methods-forward.d.ts +1 -0
  313. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  314. package/build/src/database/pool/base-methods-forward.js +12 -3
  315. package/build/src/database/pool/base.d.ts +39 -7
  316. package/build/src/database/pool/base.d.ts.map +1 -1
  317. package/build/src/database/pool/base.js +59 -18
  318. package/build/src/database/pool/single-multi-use.d.ts +1 -0
  319. package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
  320. package/build/src/database/pool/single-multi-use.js +16 -4
  321. package/build/src/database/query/alter-table-base.d.ts +1 -0
  322. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  323. package/build/src/database/query/alter-table-base.js +3 -1
  324. package/build/src/database/query/base.d.ts +3 -0
  325. package/build/src/database/query/base.d.ts.map +1 -1
  326. package/build/src/database/query/base.js +4 -1
  327. package/build/src/database/query/create-database-base.d.ts +5 -0
  328. package/build/src/database/query/create-database-base.d.ts.map +1 -1
  329. package/build/src/database/query/create-database-base.js +4 -1
  330. package/build/src/database/query/create-index-base.d.ts +5 -0
  331. package/build/src/database/query/create-index-base.d.ts.map +1 -1
  332. package/build/src/database/query/create-index-base.js +4 -1
  333. package/build/src/database/query/create-table-base.d.ts +2 -0
  334. package/build/src/database/query/create-table-base.d.ts.map +1 -1
  335. package/build/src/database/query/create-table-base.js +3 -1
  336. package/build/src/database/query/delete-base.d.ts +3 -2
  337. package/build/src/database/query/delete-base.d.ts.map +1 -1
  338. package/build/src/database/query/delete-base.js +3 -2
  339. package/build/src/database/query/drop-database-base.d.ts +5 -0
  340. package/build/src/database/query/drop-database-base.d.ts.map +1 -1
  341. package/build/src/database/query/drop-database-base.js +4 -1
  342. package/build/src/database/query/drop-table-base.d.ts +1 -0
  343. package/build/src/database/query/drop-table-base.d.ts.map +1 -1
  344. package/build/src/database/query/drop-table-base.js +3 -1
  345. package/build/src/database/query/from-base.d.ts +6 -1
  346. package/build/src/database/query/from-base.d.ts.map +1 -1
  347. package/build/src/database/query/from-base.js +7 -2
  348. package/build/src/database/query/from-plain.d.ts +1 -0
  349. package/build/src/database/query/from-plain.d.ts.map +1 -1
  350. package/build/src/database/query/from-plain.js +2 -1
  351. package/build/src/database/query/from-table.d.ts +1 -0
  352. package/build/src/database/query/from-table.d.ts.map +1 -1
  353. package/build/src/database/query/from-table.js +2 -1
  354. package/build/src/database/query/index.d.ts +72 -12
  355. package/build/src/database/query/index.d.ts.map +1 -1
  356. package/build/src/database/query/index.js +79 -19
  357. package/build/src/database/query/insert-base.d.ts +13 -8
  358. package/build/src/database/query/insert-base.d.ts.map +1 -1
  359. package/build/src/database/query/insert-base.js +10 -5
  360. package/build/src/database/query/join-base.d.ts +4 -0
  361. package/build/src/database/query/join-base.d.ts.map +1 -1
  362. package/build/src/database/query/join-base.js +5 -1
  363. package/build/src/database/query/join-object.d.ts +11 -0
  364. package/build/src/database/query/join-object.d.ts.map +1 -1
  365. package/build/src/database/query/join-object.js +15 -4
  366. package/build/src/database/query/join-plain.d.ts +1 -0
  367. package/build/src/database/query/join-plain.d.ts.map +1 -1
  368. package/build/src/database/query/join-plain.js +2 -1
  369. package/build/src/database/query/join-tracker.d.ts +7 -0
  370. package/build/src/database/query/join-tracker.d.ts.map +1 -1
  371. package/build/src/database/query/join-tracker.js +8 -1
  372. package/build/src/database/query/model-class-query.d.ts +92 -26
  373. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  374. package/build/src/database/query/model-class-query.js +230 -76
  375. package/build/src/database/query/order-base.d.ts +3 -0
  376. package/build/src/database/query/order-base.d.ts.map +1 -1
  377. package/build/src/database/query/order-base.js +4 -1
  378. package/build/src/database/query/order-column.d.ts +9 -1
  379. package/build/src/database/query/order-column.d.ts.map +1 -1
  380. package/build/src/database/query/order-column.js +10 -2
  381. package/build/src/database/query/order-plain.d.ts +1 -0
  382. package/build/src/database/query/order-plain.d.ts.map +1 -1
  383. package/build/src/database/query/order-plain.js +2 -1
  384. package/build/src/database/query/preloader/belongs-to.d.ts +1 -0
  385. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  386. package/build/src/database/query/preloader/belongs-to.js +68 -23
  387. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts +1 -0
  388. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts.map +1 -1
  389. package/build/src/database/query/preloader/ensure-model-class-initialized.js +2 -1
  390. package/build/src/database/query/preloader/has-many.d.ts +5 -3
  391. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  392. package/build/src/database/query/preloader/has-many.js +66 -24
  393. package/build/src/database/query/preloader/has-one.d.ts +1 -0
  394. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  395. package/build/src/database/query/preloader/has-one.js +26 -9
  396. package/build/src/database/query/preloader/selection.d.ts +7 -1
  397. package/build/src/database/query/preloader/selection.d.ts.map +1 -1
  398. package/build/src/database/query/preloader/selection.js +13 -5
  399. package/build/src/database/query/preloader.d.ts +1 -0
  400. package/build/src/database/query/preloader.d.ts.map +1 -1
  401. package/build/src/database/query/preloader.js +28 -9
  402. package/build/src/database/query/query-data.d.ts +21 -7
  403. package/build/src/database/query/query-data.d.ts.map +1 -1
  404. package/build/src/database/query/query-data.js +37 -18
  405. package/build/src/database/query/select-base.d.ts +3 -0
  406. package/build/src/database/query/select-base.d.ts.map +1 -1
  407. package/build/src/database/query/select-base.js +4 -1
  408. package/build/src/database/query/select-plain.d.ts +1 -0
  409. package/build/src/database/query/select-plain.d.ts.map +1 -1
  410. package/build/src/database/query/select-plain.js +2 -1
  411. package/build/src/database/query/select-table-and-column.d.ts +1 -0
  412. package/build/src/database/query/select-table-and-column.d.ts.map +1 -1
  413. package/build/src/database/query/select-table-and-column.js +2 -1
  414. package/build/src/database/query/update-base.d.ts +9 -6
  415. package/build/src/database/query/update-base.d.ts.map +1 -1
  416. package/build/src/database/query/update-base.js +7 -4
  417. package/build/src/database/query/upsert-base.d.ts +13 -4
  418. package/build/src/database/query/upsert-base.d.ts.map +1 -1
  419. package/build/src/database/query/upsert-base.js +12 -3
  420. package/build/src/database/query/where-base.d.ts +4 -0
  421. package/build/src/database/query/where-base.d.ts.map +1 -1
  422. package/build/src/database/query/where-base.js +5 -1
  423. package/build/src/database/query/where-combinator.d.ts +1 -0
  424. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  425. package/build/src/database/query/where-combinator.js +6 -2
  426. package/build/src/database/query/where-hash.d.ts +6 -0
  427. package/build/src/database/query/where-hash.d.ts.map +1 -1
  428. package/build/src/database/query/where-hash.js +5 -1
  429. package/build/src/database/query/where-model-class-hash.d.ts +30 -16
  430. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  431. package/build/src/database/query/where-model-class-hash.js +55 -20
  432. package/build/src/database/query/where-not.d.ts +1 -0
  433. package/build/src/database/query/where-not.d.ts.map +1 -1
  434. package/build/src/database/query/where-not.js +3 -1
  435. package/build/src/database/query/where-plain.d.ts +1 -0
  436. package/build/src/database/query/where-plain.d.ts.map +1 -1
  437. package/build/src/database/query/where-plain.js +2 -1
  438. package/build/src/database/query/with-count.d.ts +11 -5
  439. package/build/src/database/query/with-count.d.ts.map +1 -1
  440. package/build/src/database/query/with-count.js +36 -15
  441. package/build/src/database/query-parser/base-query-parser.d.ts +1 -0
  442. package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
  443. package/build/src/database/query-parser/base-query-parser.js +2 -1
  444. package/build/src/database/query-parser/from-parser.d.ts +5 -1
  445. package/build/src/database/query-parser/from-parser.d.ts.map +1 -1
  446. package/build/src/database/query-parser/from-parser.js +6 -2
  447. package/build/src/database/query-parser/group-parser.d.ts +2 -0
  448. package/build/src/database/query-parser/group-parser.d.ts.map +1 -1
  449. package/build/src/database/query-parser/group-parser.js +3 -1
  450. package/build/src/database/query-parser/joins-parser.d.ts +1 -0
  451. package/build/src/database/query-parser/joins-parser.d.ts.map +1 -1
  452. package/build/src/database/query-parser/joins-parser.js +2 -1
  453. package/build/src/database/query-parser/limit-parser.d.ts +1 -0
  454. package/build/src/database/query-parser/limit-parser.d.ts.map +1 -1
  455. package/build/src/database/query-parser/limit-parser.js +2 -1
  456. package/build/src/database/query-parser/options.d.ts +15 -4
  457. package/build/src/database/query-parser/options.d.ts.map +1 -1
  458. package/build/src/database/query-parser/options.js +11 -3
  459. package/build/src/database/query-parser/order-parser.d.ts +1 -0
  460. package/build/src/database/query-parser/order-parser.d.ts.map +1 -1
  461. package/build/src/database/query-parser/order-parser.js +2 -1
  462. package/build/src/database/query-parser/select-parser.d.ts +1 -0
  463. package/build/src/database/query-parser/select-parser.d.ts.map +1 -1
  464. package/build/src/database/query-parser/select-parser.js +2 -1
  465. package/build/src/database/query-parser/where-parser.d.ts +1 -0
  466. package/build/src/database/query-parser/where-parser.d.ts.map +1 -1
  467. package/build/src/database/query-parser/where-parser.js +2 -1
  468. package/build/src/database/record/acts-as-list.d.ts +0 -1
  469. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  470. package/build/src/database/record/acts-as-list.js +61 -23
  471. package/build/src/database/record/attachments/download.d.ts +34 -15
  472. package/build/src/database/record/attachments/download.d.ts.map +1 -1
  473. package/build/src/database/record/attachments/download.js +34 -22
  474. package/build/src/database/record/attachments/handle.d.ts +17 -5
  475. package/build/src/database/record/attachments/handle.d.ts.map +1 -1
  476. package/build/src/database/record/attachments/handle.js +25 -9
  477. package/build/src/database/record/attachments/normalize-input.d.ts +6 -1
  478. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  479. package/build/src/database/record/attachments/normalize-input.js +54 -17
  480. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +7 -1
  481. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  482. package/build/src/database/record/attachments/storage-drivers/filesystem.js +10 -2
  483. package/build/src/database/record/attachments/storage-drivers/native.d.ts +12 -7
  484. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  485. package/build/src/database/record/attachments/storage-drivers/native.js +13 -6
  486. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +18 -9
  487. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  488. package/build/src/database/record/attachments/storage-drivers/s3.js +38 -13
  489. package/build/src/database/record/attachments/store.d.ts +48 -25
  490. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  491. package/build/src/database/record/attachments/store.js +63 -25
  492. package/build/src/database/record/index.d.ts +388 -146
  493. package/build/src/database/record/index.d.ts.map +1 -1
  494. package/build/src/database/record/index.js +686 -248
  495. package/build/src/database/record/instance-relationships/base.d.ts +78 -19
  496. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  497. package/build/src/database/record/instance-relationships/base.js +98 -26
  498. package/build/src/database/record/instance-relationships/belongs-to.d.ts +1 -0
  499. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  500. package/build/src/database/record/instance-relationships/belongs-to.js +13 -5
  501. package/build/src/database/record/instance-relationships/has-many.d.ts +27 -7
  502. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  503. package/build/src/database/record/instance-relationships/has-many.js +50 -16
  504. package/build/src/database/record/instance-relationships/has-one.d.ts +4 -1
  505. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  506. package/build/src/database/record/instance-relationships/has-one.js +28 -10
  507. package/build/src/database/record/relationships/base.d.ts +61 -14
  508. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  509. package/build/src/database/record/relationships/base.js +60 -15
  510. package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
  511. package/build/src/database/record/relationships/belongs-to.js +9 -3
  512. package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
  513. package/build/src/database/record/relationships/has-many.js +9 -3
  514. package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
  515. package/build/src/database/record/relationships/has-one.js +9 -3
  516. package/build/src/database/record/state-machine.d.ts +9 -1
  517. package/build/src/database/record/state-machine.d.ts.map +1 -1
  518. package/build/src/database/record/state-machine.js +35 -14
  519. package/build/src/database/record/user-module.d.ts +2 -0
  520. package/build/src/database/record/user-module.d.ts.map +1 -1
  521. package/build/src/database/record/user-module.js +3 -1
  522. package/build/src/database/record/validators/base.d.ts +4 -2
  523. package/build/src/database/record/validators/base.d.ts.map +1 -1
  524. package/build/src/database/record/validators/base.js +4 -2
  525. package/build/src/database/record/validators/format.d.ts.map +1 -1
  526. package/build/src/database/record/validators/format.js +2 -1
  527. package/build/src/database/record/validators/presence.d.ts.map +1 -1
  528. package/build/src/database/record/validators/presence.js +5 -2
  529. package/build/src/database/record/validators/uniqueness.d.ts +0 -2
  530. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  531. package/build/src/database/record/validators/uniqueness.js +18 -8
  532. package/build/src/database/table-data/index.d.ts +40 -4
  533. package/build/src/database/table-data/index.d.ts.map +1 -1
  534. package/build/src/database/table-data/index.js +38 -5
  535. package/build/src/database/table-data/table-column.d.ts +43 -5
  536. package/build/src/database/table-data/table-column.d.ts.map +1 -1
  537. package/build/src/database/table-data/table-column.js +37 -4
  538. package/build/src/database/table-data/table-foreign-key.d.ts +8 -0
  539. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  540. package/build/src/database/table-data/table-foreign-key.js +9 -1
  541. package/build/src/database/table-data/table-index.d.ts +8 -0
  542. package/build/src/database/table-data/table-index.d.ts.map +1 -1
  543. package/build/src/database/table-data/table-index.js +6 -1
  544. package/build/src/database/table-data/table-reference.d.ts +1 -0
  545. package/build/src/database/table-data/table-reference.d.ts.map +1 -1
  546. package/build/src/database/table-data/table-reference.js +2 -1
  547. package/build/src/database/use-database.d.ts +1 -0
  548. package/build/src/database/use-database.d.ts.map +1 -1
  549. package/build/src/database/use-database.js +2 -1
  550. package/build/src/environment-handlers/base.d.ts +94 -36
  551. package/build/src/environment-handlers/base.d.ts.map +1 -1
  552. package/build/src/environment-handlers/base.js +90 -36
  553. package/build/src/environment-handlers/browser.d.ts +33 -3
  554. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  555. package/build/src/environment-handlers/browser.js +36 -9
  556. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts +5 -0
  557. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts.map +1 -1
  558. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +6 -2
  559. package/build/src/environment-handlers/node/cli/commands/console.d.ts +3 -2
  560. package/build/src/environment-handlers/node/cli/commands/console.d.ts.map +1 -1
  561. package/build/src/environment-handlers/node/cli/commands/console.js +23 -9
  562. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts +4 -1
  563. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts.map +1 -1
  564. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +5 -2
  565. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +6 -2
  566. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
  567. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +11 -5
  568. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts +15 -5
  569. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
  570. package/build/src/environment-handlers/node/cli/commands/db/seed.js +20 -6
  571. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +5 -0
  572. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
  573. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +3 -1
  574. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +2 -0
  575. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  576. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +6 -4
  577. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +43 -29
  578. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  579. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +99 -40
  580. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts +5 -0
  581. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
  582. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +3 -1
  583. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts +5 -0
  584. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
  585. package/build/src/environment-handlers/node/cli/commands/generate/model.js +3 -1
  586. package/build/src/environment-handlers/node/cli/commands/init.d.ts +5 -0
  587. package/build/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -1
  588. package/build/src/environment-handlers/node/cli/commands/init.js +3 -1
  589. package/build/src/environment-handlers/node/cli/commands/routes.d.ts +3 -0
  590. package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
  591. package/build/src/environment-handlers/node/cli/commands/routes.js +4 -1
  592. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts +15 -5
  593. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
  594. package/build/src/environment-handlers/node/cli/commands/run-script.js +20 -6
  595. package/build/src/environment-handlers/node/cli/commands/runner.d.ts +18 -6
  596. package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
  597. package/build/src/environment-handlers/node/cli/commands/runner.js +20 -6
  598. package/build/src/environment-handlers/node/cli/commands/server.d.ts +13 -1
  599. package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
  600. package/build/src/environment-handlers/node/cli/commands/server.js +23 -6
  601. package/build/src/environment-handlers/node.d.ts +14 -2
  602. package/build/src/environment-handlers/node.d.ts.map +1 -1
  603. package/build/src/environment-handlers/node.js +107 -39
  604. package/build/src/error-logger.d.ts +4 -3
  605. package/build/src/error-logger.d.ts.map +1 -1
  606. package/build/src/error-logger.js +4 -3
  607. package/build/src/frontend-model-controller.d.ts +239 -90
  608. package/build/src/frontend-model-controller.d.ts.map +1 -1
  609. package/build/src/frontend-model-controller.js +577 -787
  610. package/build/src/frontend-model-resource/base-resource.d.ts +118 -66
  611. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  612. package/build/src/frontend-model-resource/base-resource.js +205 -82
  613. package/build/src/frontend-models/base.d.ts +319 -163
  614. package/build/src/frontend-models/base.d.ts.map +1 -1
  615. package/build/src/frontend-models/base.js +717 -366
  616. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +2 -1
  617. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -1
  618. package/build/src/frontend-models/clear-pending-debounced-callback.js +6 -3
  619. package/build/src/frontend-models/event-hook-models.d.ts +5 -0
  620. package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
  621. package/build/src/frontend-models/event-hook-models.js +10 -3
  622. package/build/src/frontend-models/model-registry.d.ts +5 -5
  623. package/build/src/frontend-models/model-registry.d.ts.map +1 -1
  624. package/build/src/frontend-models/model-registry.js +5 -5
  625. package/build/src/frontend-models/outgoing-event-buffer.d.ts +11 -3
  626. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  627. package/build/src/frontend-models/outgoing-event-buffer.js +13 -5
  628. package/build/src/frontend-models/preloader.d.ts +9 -6
  629. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  630. package/build/src/frontend-models/preloader.js +21 -9
  631. package/build/src/frontend-models/query.d.ts +283 -73
  632. package/build/src/frontend-models/query.d.ts.map +1 -1
  633. package/build/src/frontend-models/query.js +331 -203
  634. package/build/src/frontend-models/resource-config-validation.d.ts +2 -0
  635. package/build/src/frontend-models/resource-config-validation.d.ts.map +1 -1
  636. package/build/src/frontend-models/resource-config-validation.js +3 -1
  637. package/build/src/frontend-models/resource-definition.d.ts +12 -5
  638. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  639. package/build/src/frontend-models/resource-definition.js +39 -13
  640. package/build/src/frontend-models/transport-serialization.d.ts +14 -11
  641. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  642. package/build/src/frontend-models/transport-serialization.js +80 -53
  643. package/build/src/frontend-models/use-destroyed-event.d.ts +21 -0
  644. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  645. package/build/src/frontend-models/use-destroyed-event.js +34 -11
  646. package/build/src/frontend-models/use-model-class-event.d.ts +24 -0
  647. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  648. package/build/src/frontend-models/use-model-class-event.js +39 -12
  649. package/build/src/frontend-models/use-updated-event.d.ts +21 -0
  650. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  651. package/build/src/frontend-models/use-updated-event.js +37 -12
  652. package/build/src/frontend-models/websocket-channel.d.ts +51 -9
  653. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  654. package/build/src/frontend-models/websocket-channel.js +96 -26
  655. package/build/src/frontend-models/websocket-publishers.d.ts +2 -0
  656. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  657. package/build/src/frontend-models/websocket-publishers.js +33 -11
  658. package/build/src/http-client/header.d.ts +1 -0
  659. package/build/src/http-client/header.d.ts.map +1 -1
  660. package/build/src/http-client/header.js +2 -1
  661. package/build/src/http-client/index.d.ts +4 -0
  662. package/build/src/http-client/index.d.ts.map +1 -1
  663. package/build/src/http-client/index.js +5 -1
  664. package/build/src/http-client/request.d.ts +5 -0
  665. package/build/src/http-client/request.d.ts.map +1 -1
  666. package/build/src/http-client/request.js +6 -1
  667. package/build/src/http-client/response.d.ts +14 -4
  668. package/build/src/http-client/response.d.ts.map +1 -1
  669. package/build/src/http-client/response.js +14 -4
  670. package/build/src/http-client/websocket-client.d.ts +1 -0
  671. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  672. package/build/src/http-client/websocket-client.js +2 -1
  673. package/build/src/http-server/client/index.d.ts +16 -2
  674. package/build/src/http-server/client/index.d.ts.map +1 -1
  675. package/build/src/http-server/client/index.js +44 -13
  676. package/build/src/http-server/client/params-to-object.d.ts +16 -10
  677. package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
  678. package/build/src/http-server/client/params-to-object.js +46 -17
  679. package/build/src/http-server/client/request-buffer/form-data-part.d.ts +10 -6
  680. package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
  681. package/build/src/http-server/client/request-buffer/form-data-part.js +11 -7
  682. package/build/src/http-server/client/request-buffer/header.d.ts +1 -0
  683. package/build/src/http-server/client/request-buffer/header.d.ts.map +1 -1
  684. package/build/src/http-server/client/request-buffer/header.js +2 -1
  685. package/build/src/http-server/client/request-buffer/index.d.ts +29 -4
  686. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  687. package/build/src/http-server/client/request-buffer/index.js +43 -9
  688. package/build/src/http-server/client/request-parser.d.ts +52 -13
  689. package/build/src/http-server/client/request-parser.d.ts.map +1 -1
  690. package/build/src/http-server/client/request-parser.js +58 -15
  691. package/build/src/http-server/client/request-runner.d.ts +5 -1
  692. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  693. package/build/src/http-server/client/request-runner.js +32 -8
  694. package/build/src/http-server/client/request-timing.d.ts +37 -7
  695. package/build/src/http-server/client/request-timing.d.ts.map +1 -1
  696. package/build/src/http-server/client/request-timing.js +32 -8
  697. package/build/src/http-server/client/request.d.ts +15 -5
  698. package/build/src/http-server/client/request.d.ts.map +1 -1
  699. package/build/src/http-server/client/request.js +17 -5
  700. package/build/src/http-server/client/response.d.ts +22 -4
  701. package/build/src/http-server/client/response.d.ts.map +1 -1
  702. package/build/src/http-server/client/response.js +29 -7
  703. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +1 -0
  704. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -1
  705. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +3 -1
  706. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +1 -0
  707. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -1
  708. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +3 -1
  709. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +2 -0
  710. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
  711. package/build/src/http-server/client/uploaded-file/uploaded-file.js +3 -1
  712. package/build/src/http-server/client/websocket-request.d.ts +24 -12
  713. package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
  714. package/build/src/http-server/client/websocket-request.js +24 -10
  715. package/build/src/http-server/client/websocket-session.d.ts +101 -62
  716. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  717. package/build/src/http-server/client/websocket-session.js +118 -61
  718. package/build/src/http-server/cookie.d.ts +36 -8
  719. package/build/src/http-server/cookie.d.ts.map +1 -1
  720. package/build/src/http-server/cookie.js +37 -9
  721. package/build/src/http-server/development-reloader.d.ts +32 -7
  722. package/build/src/http-server/development-reloader.d.ts.map +1 -1
  723. package/build/src/http-server/development-reloader.js +39 -10
  724. package/build/src/http-server/index.d.ts +102 -25
  725. package/build/src/http-server/index.d.ts.map +1 -1
  726. package/build/src/http-server/index.js +117 -32
  727. package/build/src/http-server/remote-address.d.ts +1 -0
  728. package/build/src/http-server/remote-address.d.ts.map +1 -1
  729. package/build/src/http-server/remote-address.js +15 -4
  730. package/build/src/http-server/server-client.d.ts +37 -8
  731. package/build/src/http-server/server-client.d.ts.map +1 -1
  732. package/build/src/http-server/server-client.js +48 -12
  733. package/build/src/http-server/server-lock.d.ts +76 -0
  734. package/build/src/http-server/server-lock.d.ts.map +1 -0
  735. package/build/src/http-server/server-lock.js +164 -0
  736. package/build/src/http-server/websocket-channel-subscribers.d.ts +13 -8
  737. package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
  738. package/build/src/http-server/websocket-channel-subscribers.js +16 -7
  739. package/build/src/http-server/websocket-channel.d.ts +13 -11
  740. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  741. package/build/src/http-server/websocket-channel.js +8 -12
  742. package/build/src/http-server/websocket-connection.d.ts +10 -14
  743. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  744. package/build/src/http-server/websocket-connection.js +8 -12
  745. package/build/src/http-server/websocket-event-log-store.d.ts +48 -10
  746. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  747. package/build/src/http-server/websocket-event-log-store.js +76 -34
  748. package/build/src/http-server/websocket-events-host.d.ts +21 -15
  749. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  750. package/build/src/http-server/websocket-events-host.js +20 -11
  751. package/build/src/http-server/websocket-events.d.ts +8 -7
  752. package/build/src/http-server/websocket-events.d.ts.map +1 -1
  753. package/build/src/http-server/websocket-events.js +6 -5
  754. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +3 -2
  755. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -1
  756. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +3 -2
  757. package/build/src/http-server/worker-handler/in-process.d.ts +18 -18
  758. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  759. package/build/src/http-server/worker-handler/in-process.js +28 -20
  760. package/build/src/http-server/worker-handler/index.d.ts +39 -20
  761. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  762. package/build/src/http-server/worker-handler/index.js +34 -14
  763. package/build/src/http-server/worker-handler/worker-thread.d.ts +31 -15
  764. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  765. package/build/src/http-server/worker-handler/worker-thread.js +31 -12
  766. package/build/src/initializer.d.ts +4 -0
  767. package/build/src/initializer.d.ts.map +1 -1
  768. package/build/src/initializer.js +5 -1
  769. package/build/src/jobs/mail-delivery.d.ts +1 -0
  770. package/build/src/jobs/mail-delivery.d.ts.map +1 -1
  771. package/build/src/jobs/mail-delivery.js +2 -1
  772. package/build/src/logger/base-logger.js +2 -2
  773. package/build/src/logger/console-logger.d.ts +2 -0
  774. package/build/src/logger/console-logger.d.ts.map +1 -1
  775. package/build/src/logger/console-logger.js +3 -1
  776. package/build/src/logger/file-logger.d.ts +2 -0
  777. package/build/src/logger/file-logger.d.ts.map +1 -1
  778. package/build/src/logger/file-logger.js +3 -1
  779. package/build/src/logger/outputs/array-output.d.ts +21 -5
  780. package/build/src/logger/outputs/array-output.d.ts.map +1 -1
  781. package/build/src/logger/outputs/array-output.js +19 -6
  782. package/build/src/logger/outputs/console-output.d.ts +10 -2
  783. package/build/src/logger/outputs/console-output.d.ts.map +1 -1
  784. package/build/src/logger/outputs/console-output.js +8 -3
  785. package/build/src/logger/outputs/file-output.d.ts +20 -5
  786. package/build/src/logger/outputs/file-output.d.ts.map +1 -1
  787. package/build/src/logger/outputs/file-output.js +18 -6
  788. package/build/src/logger/outputs/stdout-output.d.ts +7 -1
  789. package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
  790. package/build/src/logger/outputs/stdout-output.js +9 -3
  791. package/build/src/logger.d.ts +28 -13
  792. package/build/src/logger.d.ts.map +1 -1
  793. package/build/src/logger.js +60 -23
  794. package/build/src/mailer/backends/smtp.d.ts +5 -0
  795. package/build/src/mailer/backends/smtp.d.ts.map +1 -1
  796. package/build/src/mailer/backends/smtp.js +17 -4
  797. package/build/src/mailer/base.d.ts +33 -17
  798. package/build/src/mailer/base.d.ts.map +1 -1
  799. package/build/src/mailer/base.js +54 -18
  800. package/build/src/mailer/delivery.d.ts +16 -5
  801. package/build/src/mailer/delivery.d.ts.map +1 -1
  802. package/build/src/mailer/delivery.js +18 -7
  803. package/build/src/mailer/index.d.ts +5 -5
  804. package/build/src/mailer/index.d.ts.map +1 -1
  805. package/build/src/mailer/index.js +2 -2
  806. package/build/src/mailer.d.ts +5 -5
  807. package/build/src/mailer.d.ts.map +1 -1
  808. package/build/src/mailer.js +2 -2
  809. package/build/src/plugins/sqljs-wasm-route-controller.d.ts +4 -1
  810. package/build/src/plugins/sqljs-wasm-route-controller.d.ts.map +1 -1
  811. package/build/src/plugins/sqljs-wasm-route-controller.js +11 -4
  812. package/build/src/plugins/sqljs-wasm-route.d.ts +6 -0
  813. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  814. package/build/src/plugins/sqljs-wasm-route.js +4 -1
  815. package/build/src/record-payload-values.d.ts +54 -0
  816. package/build/src/record-payload-values.d.ts.map +1 -0
  817. package/build/src/record-payload-values.js +80 -0
  818. package/build/src/routes/app-routes.d.ts +1 -0
  819. package/build/src/routes/app-routes.d.ts.map +1 -1
  820. package/build/src/routes/app-routes.js +2 -1
  821. package/build/src/routes/base-route.d.ts +52 -16
  822. package/build/src/routes/base-route.d.ts.map +1 -1
  823. package/build/src/routes/base-route.js +50 -14
  824. package/build/src/routes/basic-route.d.ts +1 -0
  825. package/build/src/routes/basic-route.d.ts.map +1 -1
  826. package/build/src/routes/basic-route.js +13 -4
  827. package/build/src/routes/built-in/debug/controller.d.ts +4 -1
  828. package/build/src/routes/built-in/debug/controller.d.ts.map +1 -1
  829. package/build/src/routes/built-in/debug/controller.js +5 -2
  830. package/build/src/routes/get-route.d.ts +1 -0
  831. package/build/src/routes/get-route.d.ts.map +1 -1
  832. package/build/src/routes/get-route.js +7 -4
  833. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +1 -0
  834. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  835. package/build/src/routes/hooks/frontend-model-command-route-hook.js +6 -2
  836. package/build/src/routes/index.d.ts +3 -2
  837. package/build/src/routes/index.d.ts.map +1 -1
  838. package/build/src/routes/index.js +10 -4
  839. package/build/src/routes/namespace-route.d.ts +1 -0
  840. package/build/src/routes/namespace-route.d.ts.map +1 -1
  841. package/build/src/routes/namespace-route.js +5 -3
  842. package/build/src/routes/plugin-routes.d.ts +10 -1
  843. package/build/src/routes/plugin-routes.d.ts.map +1 -1
  844. package/build/src/routes/plugin-routes.js +11 -3
  845. package/build/src/routes/post-route.d.ts +1 -0
  846. package/build/src/routes/post-route.d.ts.map +1 -1
  847. package/build/src/routes/post-route.js +7 -4
  848. package/build/src/routes/resolver.d.ts +20 -5
  849. package/build/src/routes/resolver.d.ts.map +1 -1
  850. package/build/src/routes/resolver.js +47 -14
  851. package/build/src/routes/resource-route.d.ts +6 -1
  852. package/build/src/routes/resource-route.d.ts.map +1 -1
  853. package/build/src/routes/resource-route.js +10 -4
  854. package/build/src/testing/base-expect.d.ts +2 -0
  855. package/build/src/testing/base-expect.d.ts.map +1 -1
  856. package/build/src/testing/base-expect.js +3 -1
  857. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +33 -5
  858. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  859. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +95 -23
  860. package/build/src/testing/expect-to-change.d.ts +3 -0
  861. package/build/src/testing/expect-to-change.d.ts.map +1 -1
  862. package/build/src/testing/expect-to-change.js +4 -1
  863. package/build/src/testing/expect-utils.d.ts +22 -16
  864. package/build/src/testing/expect-utils.d.ts.map +1 -1
  865. package/build/src/testing/expect-utils.js +62 -30
  866. package/build/src/testing/expect.d.ts +50 -21
  867. package/build/src/testing/expect.d.ts.map +1 -1
  868. package/build/src/testing/expect.js +58 -17
  869. package/build/src/testing/request-client.d.ts +16 -3
  870. package/build/src/testing/request-client.d.ts.map +1 -1
  871. package/build/src/testing/request-client.js +17 -4
  872. package/build/src/testing/test-files-finder.d.ts +41 -9
  873. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  874. package/build/src/testing/test-files-finder.js +42 -10
  875. package/build/src/testing/test-filter-parser.d.ts +6 -0
  876. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  877. package/build/src/testing/test-filter-parser.js +12 -3
  878. package/build/src/testing/test-runner.d.ts +102 -6
  879. package/build/src/testing/test-runner.d.ts.map +1 -1
  880. package/build/src/testing/test-runner.js +115 -23
  881. package/build/src/testing/test-suite-splitter.d.ts +7 -0
  882. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  883. package/build/src/testing/test-suite-splitter.js +7 -2
  884. package/build/src/testing/test.d.ts +20 -4
  885. package/build/src/testing/test.d.ts.map +1 -1
  886. package/build/src/testing/test.js +67 -20
  887. package/build/src/utils/backtrace-cleaner-node.d.ts.map +1 -1
  888. package/build/src/utils/backtrace-cleaner-node.js +6 -1
  889. package/build/src/utils/backtrace-cleaner.d.ts +16 -1
  890. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  891. package/build/src/utils/backtrace-cleaner.js +20 -2
  892. package/build/src/utils/ensure-error.d.ts +3 -2
  893. package/build/src/utils/ensure-error.d.ts.map +1 -1
  894. package/build/src/utils/ensure-error.js +3 -2
  895. package/build/src/utils/event-emitter.d.ts.map +1 -1
  896. package/build/src/utils/event-emitter.js +2 -2
  897. package/build/src/utils/file-exists.d.ts +1 -0
  898. package/build/src/utils/file-exists.d.ts.map +1 -1
  899. package/build/src/utils/file-exists.js +2 -1
  900. package/build/src/utils/format-value.d.ts +5 -4
  901. package/build/src/utils/format-value.d.ts.map +1 -1
  902. package/build/src/utils/format-value.js +12 -7
  903. package/build/src/utils/model-scope.d.ts +18 -12
  904. package/build/src/utils/model-scope.d.ts.map +1 -1
  905. package/build/src/utils/model-scope.js +19 -11
  906. package/build/src/utils/nest-callbacks.d.ts +1 -0
  907. package/build/src/utils/nest-callbacks.d.ts.map +1 -1
  908. package/build/src/utils/nest-callbacks.js +2 -1
  909. package/build/src/utils/plain-object.d.ts +7 -0
  910. package/build/src/utils/plain-object.d.ts.map +1 -0
  911. package/build/src/utils/plain-object.js +13 -0
  912. package/build/src/utils/ransack.d.ts +29 -5
  913. package/build/src/utils/ransack.d.ts.map +1 -1
  914. package/build/src/utils/ransack.js +136 -49
  915. package/build/src/utils/rest-args-error.d.ts +1 -0
  916. package/build/src/utils/rest-args-error.d.ts.map +1 -1
  917. package/build/src/utils/rest-args-error.js +2 -1
  918. package/build/src/utils/singularize-model-name.d.ts +1 -0
  919. package/build/src/utils/singularize-model-name.d.ts.map +1 -1
  920. package/build/src/utils/singularize-model-name.js +2 -1
  921. package/build/src/utils/to-import-specifier.d.ts.map +1 -1
  922. package/build/src/utils/to-import-specifier.js +3 -1
  923. package/build/src/utils/with-tracked-stack-async-hooks.d.ts +8 -5
  924. package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
  925. package/build/src/utils/with-tracked-stack-async-hooks.js +32 -13
  926. package/build/src/utils/with-tracked-stack.d.ts +9 -5
  927. package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
  928. package/build/src/utils/with-tracked-stack.js +19 -8
  929. package/build/src/velocious-error.d.ts +4 -2
  930. package/build/src/velocious-error.d.ts.map +1 -1
  931. package/build/src/velocious-error.js +5 -3
  932. package/build/tsconfig.tsbuildinfo +1 -1
  933. package/package.json +1 -1
@@ -4,18 +4,25 @@ import LoggerFileOutput from "./logger/outputs/file-output.js";
4
4
  import { currentConfiguration } from "./current-configuration.js";
5
5
  import { formatValue } from "./utils/format-value.js";
6
6
  import restArgsError from "./utils/rest-args-error.js";
7
- /** @typedef {"debug-low-level" | "debug" | "info" | "warn" | "error"} LogLevel */
7
+ /**
8
+ * LogLevel type.
9
+ @typedef {"debug-low-level" | "debug" | "info" | "warn" | "error"} LogLevel */
8
10
  const DEFAULT_LOGGING_CONFIGURATION = {
9
11
  console: true,
10
12
  file: false,
11
- /** @type {LogLevel[]} */
13
+ /**
14
+ * Types the following value.
15
+ @type {LogLevel[]} */
12
16
  levels: ["info", "warn", "error"]
13
17
  };
14
- /** @type {LogLevel[]} */
18
+ /**
19
+ * Level order.
20
+ @type {LogLevel[]} */
15
21
  const LEVEL_ORDER = ["debug-low-level", "debug", "info", "warn", "error"];
16
22
  /**
17
- * @param {...any|function() : Array<any>} messages - Messages.
18
- * @returns {Array<any>} - Either the function result or the messages
23
+ * Runs function or messages.
24
+ * @param {...?|function() : Array<?>} messages - Messages.
25
+ * @returns {Array<?>} - Either the function result or the messages
19
26
  */
20
27
  function functionOrMessages(...messages) {
21
28
  if (messages.length === 1 && typeof messages[0] == "function") {
@@ -26,7 +33,7 @@ function functionOrMessages(...messages) {
26
33
  }
27
34
  /**
28
35
  * Format a single value for inclusion in a log message.
29
- * @param {any} value - Value to format.
36
+ * @param {?} value - Value to format.
30
37
  * @returns {string} - String representation.
31
38
  */
32
39
  function formatPart(value) {
@@ -46,8 +53,7 @@ function formatPart(value) {
46
53
  * messages are interpolated into it in order (like `console.log` /
47
54
  * `util.format`). Any leftover messages are appended with a space
48
55
  * separator. Otherwise, all parts are joined with spaces.
49
- *
50
- * @param {Array<any>} messages - User-supplied message parts.
56
+ * @param {Array<?>} messages - User-supplied message parts.
51
57
  * @returns {string} - The formatted user message.
52
58
  */
53
59
  function formatUserMessages(messages) {
@@ -93,9 +99,8 @@ function formatUserMessages(messages) {
93
99
  }
94
100
  /**
95
101
  * Converts a logger subject and message parts into a single log line.
96
- *
97
102
  * @param {string} subject - Logger subject / category prefix.
98
- * @param {...any} messages - User-supplied message parts (supports printf-style format specifiers on the first part).
103
+ * @param {...?} messages - User-supplied message parts (supports printf-style format specifiers on the first part).
99
104
  * @returns {string} - The formatted log line.
100
105
  */
101
106
  function messagesToMessage(subject, ...messages) {
@@ -107,6 +112,7 @@ function messagesToMessage(subject, ...messages) {
107
112
  return `${subject} ${userMessage}`;
108
113
  }
109
114
  /**
115
+ * Runs resolve logging configuration.
110
116
  * @param {import("./configuration.js").default | undefined} configuration - Configuration instance.
111
117
  * @returns {Required<Pick<import("./configuration-types.js").LoggingConfiguration, "console" | "file" | "levels">> & Partial<Pick<import("./configuration-types.js").LoggingConfiguration, "filePath" | "outputs">>} - The logging configuration.
112
118
  */
@@ -133,6 +139,7 @@ function resolveLoggingConfiguration(configuration) {
133
139
  return DEFAULT_LOGGING_CONFIGURATION;
134
140
  }
135
141
  /**
142
+ * Runs is level allowed.
136
143
  * @param {object} args - Options object.
137
144
  * @param {LogLevel} args.level - Level.
138
145
  * @param {LogLevel[]} args.allowedLevels - Allowed levels.
@@ -147,6 +154,7 @@ function isLevelAllowed({ level, allowedLevels, debugFlag }) {
147
154
  return false;
148
155
  }
149
156
  /**
157
+ * Runs resolve logging outputs.
150
158
  * @param {object} args - Options object.
151
159
  * @param {import("./configuration-types.js").LoggingConfiguration} args.loggingConfiguration - Logging configuration.
152
160
  * @param {import("./configuration.js").default | undefined} args.configuration - Configuration instance.
@@ -156,12 +164,16 @@ function resolveLoggingOutputs({ loggingConfiguration, configuration }) {
156
164
  if (Array.isArray(loggingConfiguration.outputs))
157
165
  return loggingConfiguration.outputs;
158
166
  if (Array.isArray(loggingConfiguration.loggers)) {
159
- /** @type {import("./configuration-types.js").LoggingOutputConfig[]} */
167
+ /**
168
+ * Logger outputs.
169
+ @type {import("./configuration-types.js").LoggingOutputConfig[]} */
160
170
  const loggerOutputs = [];
161
171
  for (const logger of loggingConfiguration.loggers) {
162
172
  if (!logger)
163
173
  continue;
164
- const loggerConfig = /** @type {any} */ (logger);
174
+ const loggerConfig = /**
175
+ * Types the following value.
176
+ @type {?} */ (logger);
165
177
  if (typeof loggerConfig.toOutputConfig === "function") {
166
178
  loggerOutputs.push(loggerConfig.toOutputConfig({ configuration }));
167
179
  continue;
@@ -185,7 +197,9 @@ function resolveLoggingOutputs({ loggingConfiguration, configuration }) {
185
197
  }
186
198
  return loggerOutputs;
187
199
  }
188
- /** @type {import("./configuration-types.js").LoggingOutputConfig[]} */
200
+ /**
201
+ * Outputs.
202
+ @type {import("./configuration-types.js").LoggingOutputConfig[]} */
189
203
  const outputs = [];
190
204
  if (loggingConfiguration.console !== false) {
191
205
  outputs.push({
@@ -206,6 +220,7 @@ function resolveLoggingOutputs({ loggingConfiguration, configuration }) {
206
220
  return outputs;
207
221
  }
208
222
  /**
223
+ * Runs is output level allowed.
209
224
  * @param {object} args - Options object.
210
225
  * @param {LogLevel} args.level - Level.
211
226
  * @param {import("./configuration-types.js").LoggingOutputConfig} args.outputConfig - Output configuration.
@@ -224,6 +239,7 @@ function isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debug
224
239
  return isLevelAllowed({ level, allowedLevels, debugFlag });
225
240
  }
226
241
  /**
242
+ * Runs enabled output configs.
227
243
  * @param {object} args - Options object.
228
244
  * @param {LogLevel} args.level - Level.
229
245
  * @param {import("./configuration-types.js").LoggingOutputConfig[]} args.outputs - Output configurations.
@@ -239,6 +255,7 @@ function enabledOutputConfigs({ level, outputs, loggingConfiguration, debugFlag
239
255
  });
240
256
  }
241
257
  /**
258
+ * Runs write log.
242
259
  * @param {object} args - Options object.
243
260
  * @param {string} args.subject - Log subject.
244
261
  * @param {LogLevel} args.level - Level.
@@ -260,11 +277,17 @@ async function writeLog({ subject, level, messages, configuration, loggingConfig
260
277
  if (enabledOutputs.length === 0)
261
278
  return;
262
279
  const writes = [];
263
- /** @type {Array<any> | undefined} */
280
+ /**
281
+ * Types the following value.
282
+ @type {Array<?> | undefined} */
264
283
  let resolvedMessages;
265
- /** @type {string | undefined} */
284
+ /**
285
+ * Types the following value.
286
+ @type {string | undefined} */
266
287
  let message;
267
- /** @type {import("./configuration-types.js").LoggingOutputPayload | null} */
288
+ /**
289
+ * Payload.
290
+ @type {import("./configuration-types.js").LoggingOutputPayload | null} */
268
291
  let payload = null;
269
292
  for (const outputConfig of enabledOutputs) {
270
293
  if (!payload) {
@@ -289,6 +312,7 @@ async function writeLog({ subject, level, messages, configuration, loggingConfig
289
312
  }
290
313
  export default class Logger {
291
314
  /**
315
+ * Runs constructor.
292
316
  * @param {string | object} object - Object.
293
317
  * @param {object} args - Options object.
294
318
  * @param {import("./configuration.js").default} [args.configuration] - Configuration instance.
@@ -309,16 +333,20 @@ export default class Logger {
309
333
  }
310
334
  }
311
335
  /**
336
+ * Runs get configuration.
312
337
  * @returns {import("./configuration.js").default} - The configuration.
313
338
  */
314
339
  getConfiguration() {
315
340
  if (!this._configuration) {
316
- const objectWithConfig = /** @type {{configuration?: import("./configuration.js").default}} */ (this._object);
341
+ const objectWithConfig = /**
342
+ * Types the following value.
343
+ @type {{configuration?: import("./configuration.js").default}} */ (this._object);
317
344
  this._configuration = objectWithConfig?.configuration || currentConfiguration();
318
345
  }
319
346
  return this._configuration;
320
347
  }
321
348
  /**
349
+ * Runs safe configuration.
322
350
  * @returns {import("./configuration.js").default | undefined} - The safe configuration.
323
351
  */
324
352
  _safeConfiguration() {
@@ -330,6 +358,7 @@ export default class Logger {
330
358
  }
331
359
  }
332
360
  /**
361
+ * Runs is level enabled.
333
362
  * @param {LogLevel} level - Level.
334
363
  * @returns {boolean} - Whether any configured output emits this level.
335
364
  */
@@ -345,41 +374,47 @@ export default class Logger {
345
374
  }).length > 0;
346
375
  }
347
376
  /**
348
- * @param {any[]} messages - Messages.
377
+ * Runs debug.
378
+ * @param {Array<?>} messages - Messages.
349
379
  * @returns {Promise<void>} - Resolves when complete.
350
380
  */
351
381
  async debug(...messages) {
352
382
  await this._write({ level: "debug", messages });
353
383
  }
354
384
  /**
355
- * @param {any[]} messages - Messages.
385
+ * Runs info.
386
+ * @param {Array<?>} messages - Messages.
356
387
  * @returns {Promise<void>} - Resolves when complete.
357
388
  */
358
389
  async info(...messages) {
359
390
  await this._write({ level: "info", messages });
360
391
  }
361
392
  /**
362
- * @param {any[]} messages - Messages.
393
+ * Runs debug low level.
394
+ * @param {Array<?>} messages - Messages.
363
395
  * @returns {Promise<void>} - Resolves when complete.
364
396
  */
365
397
  async debugLowLevel(...messages) {
366
398
  await this._write({ level: "debug-low-level", messages });
367
399
  }
368
400
  /**
369
- * @param {any[]} messages - Messages.
401
+ * Runs log.
402
+ * @param {Array<?>} messages - Messages.
370
403
  * @returns {Promise<void>} - Resolves when complete.
371
404
  */
372
405
  async log(...messages) {
373
406
  await this._write({ level: "info", messages });
374
407
  }
375
408
  /**
376
- * @param {any[]} messages - Messages.
409
+ * Runs error.
410
+ * @param {Array<?>} messages - Messages.
377
411
  * @returns {Promise<void>} - Resolves when complete.
378
412
  */
379
413
  async error(...messages) {
380
414
  await this._write({ level: "error", messages });
381
415
  }
382
416
  /**
417
+ * Runs set debug.
383
418
  * @param {boolean} newValue - New value.
384
419
  * @returns {void} - No return value.
385
420
  */
@@ -387,12 +422,14 @@ export default class Logger {
387
422
  this._debug = newValue;
388
423
  }
389
424
  /**
425
+ * Runs warn.
390
426
  * @type {(...args: Parameters<typeof functionOrMessages>) => Promise<void>}
391
427
  */
392
428
  async warn(...messages) {
393
429
  await this._write({ level: "warn", messages });
394
430
  }
395
431
  /**
432
+ * Runs write.
396
433
  * @param {object} args - Options object.
397
434
  * @param {LogLevel} args.level - Level.
398
435
  * @param {Parameters<typeof functionOrMessages>} args.messages - Messages.
@@ -411,4 +448,4 @@ export default class Logger {
411
448
  });
412
449
  }
413
450
  }
414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLGdCQUFnQixNQUFNLGlDQUFpQyxDQUFBO0FBQzlELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RCxrRkFBa0Y7QUFFbEYsTUFBTSw2QkFBNkIsR0FBRztJQUNwQyxPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxLQUFLO0lBQ1gseUJBQXlCO0lBQ3pCLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ2xDLENBQUE7QUFFRCx5QkFBeUI7QUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUV6RTs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQUcsUUFBUTtJQUNyQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzVCLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxV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QUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVE7UUFDckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsUUFBUTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRO1FBQ3BCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztRQUM1QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUMvQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsSUFBSSwyQkFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVyRyxNQUFNLFFBQVEsQ0FBQztZQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN0QixLQUFLO1lBQ0wsUUFBUTtZQUNSLGFBQWE7WUFDYixvQkFBb0I7WUFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3ZCLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyQ29uc29sZU91dHB1dCBmcm9tIFwiLi9sb2dnZXIvb3V0cHV0cy9jb25zb2xlLW91dHB1dC5qc1wiXG5pbXBvcnQgTG9nZ2VyRmlsZU91dHB1dCBmcm9tIFwiLi9sb2dnZXIvb3V0cHV0cy9maWxlLW91dHB1dC5qc1wiXG5pbXBvcnQge2N1cnJlbnRDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jdXJyZW50LWNvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IHtmb3JtYXRWYWx1ZX0gZnJvbSBcIi4vdXRpbHMvZm9ybWF0LXZhbHVlLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsICovXG5cbmNvbnN0IERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OID0ge1xuICBjb25zb2xlOiB0cnVlLFxuICBmaWxlOiBmYWxzZSxcbiAgLyoqIEB0eXBlIHtMb2dMZXZlbFtdfSAqL1xuICBsZXZlbHM6IFtcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIl1cbn1cblxuLyoqIEB0eXBlIHtMb2dMZXZlbFtdfSAqL1xuY29uc3QgTEVWRUxfT1JERVIgPSBbXCJkZWJ1Zy1sb3ctbGV2ZWxcIiwgXCJkZWJ1Z1wiLCBcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIl1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueXxmdW5jdGlvbigpIDogQXJyYXk8YW55Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAqIEByZXR1cm5zIHtBcnJheTxhbnk+fSAtIEVpdGhlciB0aGUgZnVuY3Rpb24gcmVzdWx0IG9yIHRoZSBtZXNzYWdlc1xuICovXG5mdW5jdGlvbiBmdW5jdGlvbk9yTWVzc2FnZXMoLi4ubWVzc2FnZXMpIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgbWVzc2FnZXNbMF0gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbWVzc2FnZXNbMF0oKVxuICAgIG1lc3NhZ2VzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF1cbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlc1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIHNpbmdsZSB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGEgbG9nIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBWYWx1ZSB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFydCh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBgJHt2YWx1ZS5tZXNzYWdlfVxcbiR7dmFsdWUuc3RhY2t9YFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmb3JtYXRWYWx1ZSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlcyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBJZiB0aGUgZmlyc3QgbWVzc2FnZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHByaW50Zi1zdHlsZSBmb3JtYXRcbiAqIHNwZWNpZmllcnMgKGAlc2AsIGAlZGAsIGAlamAsIGAlb2AsIGAlT2AsIG9yIGAlJWApLCB0aGUgcmVtYWluaW5nXG4gKiBtZXNzYWdlcyBhcmUgaW50ZXJwb2xhdGVkIGludG8gaXQgaW4gb3JkZXIgKGxpa2UgYGNvbnNvbGUubG9nYCAvXG4gKiBgdXRpbC5mb3JtYXRgKS4gQW55IGxlZnRvdmVyIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZCB3aXRoIGEgc3BhY2VcbiAqIHNlcGFyYXRvci4gT3RoZXJ3aXNlLCBhbGwgcGFydHMgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHVzZXIgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0VXNlck1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG5cbiAgY29uc3QgZmlyc3QgPSBtZXNzYWdlc1swXVxuXG4gIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgLyVbc2Rqb08lXS8udGVzdChmaXJzdCkpIHtcbiAgICBsZXQgYXJnSW5kZXggPSAxXG4gICAgY29uc3QgZm9ybWF0dGVkID0gZmlyc3QucmVwbGFjZSgvJVtzZGpvTyVdL2csIChtYXRjaCkgPT4ge1xuICAgICAgaWYgKG1hdGNoID09PSBcIiUlXCIpIHJldHVybiBcIiVcIlxuICAgICAgaWYgKGFyZ0luZGV4ID49IG1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuIG1hdGNoXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZXNbYXJnSW5kZXhdXG5cbiAgICAgIGFyZ0luZGV4ICs9IDFcblxuICAgICAgaWYgKG1hdGNoID09PSBcIiVkXCIpIHtcbiAgICAgICAgLy8gTWF0Y2ggdXRpbC5mb3JtYXQ6IG5ldmVyIHRocm93IGZvciBub24tY29lcmNpYmxlIHZhbHVlcyDigJQgeWllbGQgXCJOYU5cIiBpbnN0ZWFkLlxuICAgICAgICAvLyBOdW1iZXIoU3ltYm9sKCkpIHRocm93cywgc28gY2F0Y2ggYW5kIGZhbGwgYmFjay5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2YWx1ZSkpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIk5hTlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaCA9PT0gXCIlalwiIHx8IG1hdGNoID09PSBcIiVvXCIgfHwgbWF0Y2ggPT09IFwiJU9cIikgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKVxuXG4gICAgICByZXR1cm4gZm9ybWF0UGFydCh2YWx1ZSlcbiAgICB9KVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBmb3JtYXR0ZWRcblxuICAgIGZvciAobGV0IGluZGV4ID0gYXJnSW5kZXg7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBtZXNzYWdlICs9IGAgJHtmb3JtYXRQYXJ0KG1lc3NhZ2VzW2luZGV4XSl9YFxuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlXG4gIH1cblxuICBsZXQgbWVzc2FnZSA9IFwiXCJcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaWYgKGluZGV4ID4gMCkgbWVzc2FnZSArPSBcIiBcIlxuICAgIG1lc3NhZ2UgKz0gZm9ybWF0UGFydChtZXNzYWdlc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbG9nZ2VyIHN1YmplY3QgYW5kIG1lc3NhZ2UgcGFydHMgaW50byBhIHNpbmdsZSBsb2cgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdCAtIExvZ2dlciBzdWJqZWN0IC8gY2F0ZWdvcnkgcHJlZml4LlxuICogQHBhcmFtIHsuLi5hbnl9IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzIChzdXBwb3J0cyBwcmludGYtc3R5bGUgZm9ybWF0IHNwZWNpZmllcnMgb24gdGhlIGZpcnN0IHBhcnQpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIGxvZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5tZXNzYWdlcykge1xuICBjb25zdCB1c2VyTWVzc2FnZSA9IGZvcm1hdFVzZXJNZXNzYWdlcyhtZXNzYWdlcylcblxuICBpZiAoIXN1YmplY3QpIHJldHVybiB1c2VyTWVzc2FnZVxuICBpZiAoIXVzZXJNZXNzYWdlKSByZXR1cm4gU3RyaW5nKHN1YmplY3QpXG5cbiAgcmV0dXJuIGAke3N1YmplY3R9ICR7dXNlck1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge1JlcXVpcmVkPFBpY2s8aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9uLCBcImNvbnNvbGVcIiB8IFwiZmlsZVwiIHwgXCJsZXZlbHNcIj4+ICYgUGFydGlhbDxQaWNrPGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiwgXCJmaWxlUGF0aFwiIHwgXCJvdXRwdXRzXCI+Pn0gLSBUaGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICBjb25zdCBkZWJ1Z0VuYWJsZWQgPSBjb25maWd1cmF0aW9uPy5kZWJ1ZyA9PT0gdHJ1ZVxuICBpZiAoY29uZmlndXJhdGlvbiAmJiB0eXBlb2YgY29uZmlndXJhdGlvbi5nZXRMb2dnaW5nQ29uZmlndXJhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBjb25maWd1cmF0aW9uLmdldExvZ2dpbmdDb25maWd1cmF0aW9uKClcblxuICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlc29sdmVkLFxuICAgICAgICBjb25zb2xlOiB0cnVlLFxuICAgICAgICBsZXZlbHM6IExFVkVMX09SREVSXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkRFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OLFxuICAgICAgY29uc29sZTogdHJ1ZSxcbiAgICAgIGxldmVsczogTEVWRUxfT1JERVJcbiAgICB9XG4gIH1cblxuICByZXR1cm4gREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT05cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtMb2dMZXZlbFtdfSBhcmdzLmFsbG93ZWRMZXZlbHMgLSBBbGxvd2VkIGxldmVscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbGV2ZWwgYWxsb3dlZC5cbiAqL1xuZnVuY3Rpb24gaXNMZXZlbEFsbG93ZWQoe2xldmVsLCBhbGxvd2VkTGV2ZWxzLCBkZWJ1Z0ZsYWd9KSB7XG4gIGlmIChhbGxvd2VkTGV2ZWxzLmluY2x1ZGVzKGxldmVsKSkgcmV0dXJuIHRydWVcblxuICBpZiAoZGVidWdGbGFnICYmIExFVkVMX09SREVSLmluZGV4T2YobGV2ZWwpID49IExFVkVMX09SREVSLmluZGV4T2YoXCJkZWJ1Z1wiKSkgcmV0dXJuIHRydWVcblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb259IGFyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb24gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IC0gTG9nZ2luZyBvdXRwdXRzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTG9nZ2luZ091dHB1dHMoe2xvZ2dpbmdDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9ufSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShsb2dnaW5nQ29uZmlndXJhdGlvbi5vdXRwdXRzKSkgcmV0dXJuIGxvZ2dpbmdDb25maWd1cmF0aW9uLm91dHB1dHNcblxuICBpZiAoQXJyYXkuaXNBcnJheShsb2dnaW5nQ29uZmlndXJhdGlvbi5sb2dnZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgICBjb25zdCBsb2dnZXJPdXRwdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpIHtcbiAgICAgIGlmICghbG9nZ2VyKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBsb2dnZXJDb25maWcgPSAvKiogQHR5cGUge2FueX0gKi8gKGxvZ2dlcilcblxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXJDb25maWcudG9PdXRwdXRDb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2gobG9nZ2VyQ29uZmlnLnRvT3V0cHV0Q29uZmlnKHtjb25maWd1cmF0aW9ufSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChsb2dnZXJDb25maWcub3V0cHV0ICYmIHR5cGVvZiBsb2dnZXJDb25maWcub3V0cHV0LndyaXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbG9nZ2VyT3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBvdXRwdXQ6IGxvZ2dlckNvbmZpZy5vdXRwdXQsXG4gICAgICAgICAgbGV2ZWxzOiBsb2dnZXJDb25maWcubGV2ZWxzXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbG9nZ2VyQ29uZmlnLndyaXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbG9nZ2VyT3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBvdXRwdXQ6IGxvZ2dlckNvbmZpZyxcbiAgICAgICAgICBsZXZlbHM6IGxvZ2dlckNvbmZpZy5sZXZlbHNcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nZ2VyTmFtZSA9IGxvZ2dlckNvbmZpZz8uY29uc3RydWN0b3I/Lm5hbWUgfHwgXCJVbmtub3duTG9nZ2VyXCJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9nZ2VyIG11c3QgaW1wbGVtZW50IHRvT3V0cHV0Q29uZmlnIG9yIHdyaXRlOiAke2xvZ2dlck5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nZ2VyT3V0cHV0c1xuICB9XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSAqL1xuICBjb25zdCBvdXRwdXRzID0gW11cbiAgaWYgKGxvZ2dpbmdDb25maWd1cmF0aW9uLmNvbnNvbGUgIT09IGZhbHNlKSB7XG4gICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgIG91dHB1dDogbmV3IExvZ2dlckNvbnNvbGVPdXRwdXQoKSxcbiAgICAgIGxldmVsczogbG9nZ2luZ0NvbmZpZ3VyYXRpb24ubGV2ZWxzXG4gICAgfSlcbiAgfVxuXG4gIGlmIChsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlICE9PSBmYWxzZSAmJiBsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlUGF0aCkge1xuICAgIG91dHB1dHMucHVzaCh7XG4gICAgICBvdXRwdXQ6IG5ldyBMb2dnZXJGaWxlT3V0cHV0KHtcbiAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgZ2V0Q29uZmlndXJhdGlvbjogKCkgPT4gY29uZmlndXJhdGlvbixcbiAgICAgICAgZmlsZVBhdGg6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmZpbGVQYXRoXG4gICAgICB9KSxcbiAgICAgIGxldmVsczogbG9nZ2luZ0NvbmZpZ3VyYXRpb24ubGV2ZWxzXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRzXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWd9IGFyZ3Mub3V0cHV0Q29uZmlnIC0gT3V0cHV0IGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgb3V0cHV0IHNob3VsZCBsb2cuXG4gKi9cbmZ1bmN0aW9uIGlzT3V0cHV0TGV2ZWxBbGxvd2VkKHtsZXZlbCwgb3V0cHV0Q29uZmlnLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgZGVidWdGbGFnfSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRDb25maWcubGV2ZWxzKSkge1xuICAgIHJldHVybiBpc0xldmVsQWxsb3dlZCh7bGV2ZWwsIGFsbG93ZWRMZXZlbHM6IG91dHB1dENvbmZpZy5sZXZlbHMsIGRlYnVnRmxhZzogZmFsc2V9KVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0Q29uZmlnLm91dHB1dD8ubGV2ZWxzKSkge1xuICAgIHJldHVybiBpc0xldmVsQWxsb3dlZCh7bGV2ZWwsIGFsbG93ZWRMZXZlbHM6IG91dHB1dENvbmZpZy5vdXRwdXQubGV2ZWxzLCBkZWJ1Z0ZsYWc6IGZhbHNlfSlcbiAgfVxuXG4gIGNvbnN0IGFsbG93ZWRMZXZlbHMgPSBsb2dnaW5nQ29uZmlndXJhdGlvbi5sZXZlbHMgfHwgREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT04ubGV2ZWxzXG5cbiAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVscywgZGVidWdGbGFnfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSBhcmdzLm91dHB1dHMgLSBPdXRwdXQgY29uZmlndXJhdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSAtIE91dHB1dHMgZW5hYmxlZCBmb3IgdGhlIGxldmVsLlxuICovXG5mdW5jdGlvbiBlbmFibGVkT3V0cHV0Q29uZmlncyh7bGV2ZWwsIG91dHB1dHMsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIHJldHVybiBvdXRwdXRzLmZpbHRlcigob3V0cHV0Q29uZmlnKSA9PiB7XG4gICAgaWYgKCFvdXRwdXRDb25maWcgfHwgIW91dHB1dENvbmZpZy5vdXRwdXQgfHwgdHlwZW9mIG91dHB1dENvbmZpZy5vdXRwdXQud3JpdGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gaXNPdXRwdXRMZXZlbEFsbG93ZWQoe2xldmVsLCBvdXRwdXRDb25maWcsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KVxuICB9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJqZWN0IC0gTG9nIHN1YmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTG9nKHtzdWJqZWN0LCBsZXZlbCwgbWVzc2FnZXMsIGNvbmZpZ3VyYXRpb24sIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGNvbnN0IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSBsb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgY29uc3Qgb3V0cHV0cyA9IHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb246IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KVxuICBjb25zdCBlbmFibGVkT3V0cHV0cyA9IGVuYWJsZWRPdXRwdXRDb25maWdzKHtcbiAgICBsZXZlbCxcbiAgICBvdXRwdXRzLFxuICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uOiByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgIGRlYnVnRmxhZ1xuICB9KVxuXG4gIGlmIChlbmFibGVkT3V0cHV0cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHdyaXRlcyA9IFtdXG4gIC8qKiBAdHlwZSB7QXJyYXk8YW55PiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJlc29sdmVkTWVzc2FnZXNcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXNzYWdlXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRQYXlsb2FkIHwgbnVsbH0gKi9cbiAgbGV0IHBheWxvYWQgPSBudWxsXG5cbiAgZm9yIChjb25zdCBvdXRwdXRDb25maWcgb2YgZW5hYmxlZE91dHB1dHMpIHtcbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHJlc29sdmVkTWVzc2FnZXMgPSBmdW5jdGlvbk9yTWVzc2FnZXMoLi4ubWVzc2FnZXMpXG4gICAgICBtZXNzYWdlID0gbWVzc2FnZXNUb01lc3NhZ2Uoc3ViamVjdCwgLi4ucmVzb2x2ZWRNZXNzYWdlcylcbiAgICAgIC8vIHN1YmplY3QgaXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJnLCB0aGVuIHRoZSB1c2VyIG1lc3NhZ2VzXG4gICAgICBwYXlsb2FkID0ge1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVzLnB1c2gob3V0cHV0Q29uZmlnLm91dHB1dC53cml0ZShwYXlsb2FkKSlcbiAgfVxuXG4gIGlmICh3cml0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgYXdhaXQgd3JpdGVzWzBdXG4gIH0gZWxzZSBpZiAod3JpdGVzLmxlbmd0aCA+IDEpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3cml0ZXMpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBvYmplY3QgLSBPYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gW2FyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb25dIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0LCB7Y29uZmlndXJhdGlvbiwgZGVidWcgPSBmYWxzZSwgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2xvZ2dpbmdDb25maWd1cmF0aW9uID0gbG9nZ2luZ0NvbmZpZ3VyYXRpb25cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBvYmplY3QgfHwgXCJFbXB0eVN0cmluZ1wiXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuICAgICAgdGhpcy5fc3ViamVjdCA9IG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiVW5rbm93bkNsYXNzXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNvbnN0IG9iamVjdFdpdGhDb25maWcgPSAvKiogQHR5cGUge3tjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSAqLyAodGhpcy5fb2JqZWN0KVxuICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IG9iamVjdFdpdGhDb25maWc/LmNvbmZpZ3VyYXRpb24gfHwgY3VycmVudENvbmZpZ3VyYXRpb24oKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBzYWZlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBfc2FmZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIExldmVsLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFueSBjb25maWd1cmVkIG91dHB1dCBlbWl0cyB0aGlzIGxldmVsLlxuICAgKi9cbiAgaXNMZXZlbEVuYWJsZWQobGV2ZWwpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5fc2FmZUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGxvZ2dpbmdDb25maWd1cmF0aW9uID0gdGhpcy5fbG9nZ2luZ0NvbmZpZ3VyYXRpb24gfHwgcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3Qgb3V0cHV0cyA9IHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KVxuXG4gICAgcmV0dXJuIGVuYWJsZWRPdXRwdXRDb25maWdzKHtcbiAgICAgIGxldmVsLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgICAgZGVidWdGbGFnOiB0aGlzLl9kZWJ1Z1xuICAgIH0pLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGVidWcoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZGVidWdcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBpbmZvKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImluZm9cIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkZWJ1Z0xvd0xldmVsKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImRlYnVnLWxvdy1sZXZlbFwiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGxvZyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZXJyb3IoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZXJyb3JcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmV3VmFsdWUgLSBOZXcgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldERlYnVnKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5fZGVidWcgPSBuZXdWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZnVuY3Rpb25Pck1lc3NhZ2VzPikgPT4gUHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhcm4oLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwid2FyblwiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICAgKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF93cml0ZSh7bGV2ZWwsIG1lc3NhZ2VzfSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl9zYWZlQ29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9sb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHdyaXRlTG9nKHtcbiAgICAgIHN1YmplY3Q6IHRoaXMuX3N1YmplY3QsXG4gICAgICBsZXZlbCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgICAgZGVidWdGbGFnOiB0aGlzLl9kZWJ1Z1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLGdCQUFnQixNQUFNLGlDQUFpQyxDQUFBO0FBQzlELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RDs7Z0ZBRWdGO0FBRWhGLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsS0FBSztJQUNYOzsyQkFFdUI7SUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7Q0FDbEMsQ0FBQTtBQUVEOzt1QkFFdUI7QUFDdkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUV6RTs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLFFBQVE7SUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUM1QixRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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QUE7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUTtRQUNyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsUUFBUTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUTtRQUNwQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJHLE1BQU0sUUFBUSxDQUFDO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEtBQUs7WUFDTCxRQUFRO1lBQ1IsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXJDb25zb2xlT3V0cHV0IGZyb20gXCIuL2xvZ2dlci9vdXRwdXRzL2NvbnNvbGUtb3V0cHV0LmpzXCJcbmltcG9ydCBMb2dnZXJGaWxlT3V0cHV0IGZyb20gXCIuL2xvZ2dlci9vdXRwdXRzL2ZpbGUtb3V0cHV0LmpzXCJcbmltcG9ydCB7Y3VycmVudENvbmZpZ3VyYXRpb259IGZyb20gXCIuL2N1cnJlbnQtY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQge2Zvcm1hdFZhbHVlfSBmcm9tIFwiLi91dGlscy9mb3JtYXQtdmFsdWUuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBMb2dMZXZlbCB0eXBlLlxuICBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsICovXG5cbmNvbnN0IERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OID0ge1xuICBjb25zb2xlOiB0cnVlLFxuICBmaWxlOiBmYWxzZSxcbiAgLyoqXG4gICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgQHR5cGUge0xvZ0xldmVsW119ICovXG4gIGxldmVsczogW1wiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXVxufVxuXG4vKipcbiAqIExldmVsIG9yZGVyLlxuICBAdHlwZSB7TG9nTGV2ZWxbXX0gKi9cbmNvbnN0IExFVkVMX09SREVSID0gW1wiZGVidWctbG93LWxldmVsXCIsIFwiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdXG5cbi8qKlxuICogUnVucyBmdW5jdGlvbiBvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7Li4uP3xmdW5jdGlvbigpIDogQXJyYXk8Pz59IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7QXJyYXk8Pz59IC0gRWl0aGVyIHRoZSBmdW5jdGlvbiByZXN1bHQgb3IgdGhlIG1lc3NhZ2VzXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uT3JNZXNzYWdlcyguLi5tZXNzYWdlcykge1xuICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBtZXNzYWdlc1swXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBtZXNzYWdlc1swXSgpXG4gICAgbWVzc2FnZXMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2VzXG59XG5cbi8qKlxuICogRm9ybWF0IGEgc2luZ2xlIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYSBsb2cgbWVzc2FnZS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBWYWx1ZSB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFydCh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBgJHt2YWx1ZS5tZXNzYWdlfVxcbiR7dmFsdWUuc3RhY2t9YFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmb3JtYXRWYWx1ZSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlcyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBJZiB0aGUgZmlyc3QgbWVzc2FnZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHByaW50Zi1zdHlsZSBmb3JtYXRcbiAqIHNwZWNpZmllcnMgKGAlc2AsIGAlZGAsIGAlamAsIGAlb2AsIGAlT2AsIG9yIGAlJWApLCB0aGUgcmVtYWluaW5nXG4gKiBtZXNzYWdlcyBhcmUgaW50ZXJwb2xhdGVkIGludG8gaXQgaW4gb3JkZXIgKGxpa2UgYGNvbnNvbGUubG9nYCAvXG4gKiBgdXRpbC5mb3JtYXRgKS4gQW55IGxlZnRvdmVyIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZCB3aXRoIGEgc3BhY2VcbiAqIHNlcGFyYXRvci4gT3RoZXJ3aXNlLCBhbGwgcGFydHMgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcy5cbiAqIEBwYXJhbSB7QXJyYXk8Pz59IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHVzZXIgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0VXNlck1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG5cbiAgY29uc3QgZmlyc3QgPSBtZXNzYWdlc1swXVxuXG4gIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgLyVbc2Rqb08lXS8udGVzdChmaXJzdCkpIHtcbiAgICBsZXQgYXJnSW5kZXggPSAxXG4gICAgY29uc3QgZm9ybWF0dGVkID0gZmlyc3QucmVwbGFjZSgvJVtzZGpvTyVdL2csIChtYXRjaCkgPT4ge1xuICAgICAgaWYgKG1hdGNoID09PSBcIiUlXCIpIHJldHVybiBcIiVcIlxuICAgICAgaWYgKGFyZ0luZGV4ID49IG1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuIG1hdGNoXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZXNbYXJnSW5kZXhdXG5cbiAgICAgIGFyZ0luZGV4ICs9IDFcblxuICAgICAgaWYgKG1hdGNoID09PSBcIiVkXCIpIHtcbiAgICAgICAgLy8gTWF0Y2ggdXRpbC5mb3JtYXQ6IG5ldmVyIHRocm93IGZvciBub24tY29lcmNpYmxlIHZhbHVlcyDigJQgeWllbGQgXCJOYU5cIiBpbnN0ZWFkLlxuICAgICAgICAvLyBOdW1iZXIoU3ltYm9sKCkpIHRocm93cywgc28gY2F0Y2ggYW5kIGZhbGwgYmFjay5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2YWx1ZSkpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIk5hTlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaCA9PT0gXCIlalwiIHx8IG1hdGNoID09PSBcIiVvXCIgfHwgbWF0Y2ggPT09IFwiJU9cIikgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKVxuXG4gICAgICByZXR1cm4gZm9ybWF0UGFydCh2YWx1ZSlcbiAgICB9KVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBmb3JtYXR0ZWRcblxuICAgIGZvciAobGV0IGluZGV4ID0gYXJnSW5kZXg7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBtZXNzYWdlICs9IGAgJHtmb3JtYXRQYXJ0KG1lc3NhZ2VzW2luZGV4XSl9YFxuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlXG4gIH1cblxuICBsZXQgbWVzc2FnZSA9IFwiXCJcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaWYgKGluZGV4ID4gMCkgbWVzc2FnZSArPSBcIiBcIlxuICAgIG1lc3NhZ2UgKz0gZm9ybWF0UGFydChtZXNzYWdlc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbG9nZ2VyIHN1YmplY3QgYW5kIG1lc3NhZ2UgcGFydHMgaW50byBhIHNpbmdsZSBsb2cgbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gTG9nZ2VyIHN1YmplY3QgLyBjYXRlZ29yeSBwcmVmaXguXG4gKiBAcGFyYW0gey4uLj99IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzIChzdXBwb3J0cyBwcmludGYtc3R5bGUgZm9ybWF0IHNwZWNpZmllcnMgb24gdGhlIGZpcnN0IHBhcnQpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIGxvZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5tZXNzYWdlcykge1xuICBjb25zdCB1c2VyTWVzc2FnZSA9IGZvcm1hdFVzZXJNZXNzYWdlcyhtZXNzYWdlcylcblxuICBpZiAoIXN1YmplY3QpIHJldHVybiB1c2VyTWVzc2FnZVxuICBpZiAoIXVzZXJNZXNzYWdlKSByZXR1cm4gU3RyaW5nKHN1YmplY3QpXG5cbiAgcmV0dXJuIGAke3N1YmplY3R9ICR7dXNlck1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtSZXF1aXJlZDxQaWNrPGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiwgXCJjb25zb2xlXCIgfCBcImZpbGVcIiB8IFwibGV2ZWxzXCI+PiAmIFBhcnRpYWw8UGljazxpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIFwiZmlsZVBhdGhcIiB8IFwib3V0cHV0c1wiPj59IC0gVGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgZGVidWdFbmFibGVkID0gY29uZmlndXJhdGlvbj8uZGVidWcgPT09IHRydWVcbiAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgdHlwZW9mIGNvbmZpZ3VyYXRpb24uZ2V0TG9nZ2luZ0NvbmZpZ3VyYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gY29uZmlndXJhdGlvbi5nZXRMb2dnaW5nQ29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNvbHZlZCxcbiAgICAgICAgY29uc29sZTogdHJ1ZSxcbiAgICAgICAgbGV2ZWxzOiBMRVZFTF9PUkRFUlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5ERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTixcbiAgICAgIGNvbnNvbGU6IHRydWUsXG4gICAgICBsZXZlbHM6IExFVkVMX09SREVSXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OXG59XG5cbi8qKlxuICogUnVucyBpcyBsZXZlbCBhbGxvd2VkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWxbXX0gYXJncy5hbGxvd2VkTGV2ZWxzIC0gQWxsb3dlZCBsZXZlbHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnRmxhZ10gLSBXaGV0aGVyIGRlYnVnIGZsYWcuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGxldmVsIGFsbG93ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVscywgZGVidWdGbGFnfSkge1xuICBpZiAoYWxsb3dlZExldmVscy5pbmNsdWRlcyhsZXZlbCkpIHJldHVybiB0cnVlXG5cbiAgaWYgKGRlYnVnRmxhZyAmJiBMRVZFTF9PUkRFUi5pbmRleE9mKGxldmVsKSA+PSBMRVZFTF9PUkRFUi5pbmRleE9mKFwiZGVidWdcIikpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogUnVucyByZXNvbHZlIGxvZ2dpbmcgb3V0cHV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gLSBMb2dnaW5nIG91dHB1dHMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLm91dHB1dHMpKSByZXR1cm4gbG9nZ2luZ0NvbmZpZ3VyYXRpb24ub3V0cHV0c1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpKSB7XG4gICAgLyoqXG4gICAgICogTG9nZ2VyIG91dHB1dHMuXG4gICAgICBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgICBjb25zdCBsb2dnZXJPdXRwdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpIHtcbiAgICAgIGlmICghbG9nZ2VyKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBsb2dnZXJDb25maWcgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAobG9nZ2VyKVxuXG4gICAgICBpZiAodHlwZW9mIGxvZ2dlckNvbmZpZy50b091dHB1dENvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGxvZ2dlck91dHB1dHMucHVzaChsb2dnZXJDb25maWcudG9PdXRwdXRDb25maWcoe2NvbmZpZ3VyYXRpb259KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2dlckNvbmZpZy5vdXRwdXQgJiYgdHlwZW9mIGxvZ2dlckNvbmZpZy5vdXRwdXQud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLm91dHB1dCxcbiAgICAgICAgICBsZXZlbHM6IGxvZ2dlckNvbmZpZy5sZXZlbHNcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXJDb25maWcud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLFxuICAgICAgICAgIGxldmVsczogbG9nZ2VyQ29uZmlnLmxldmVsc1xuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2dnZXJOYW1lID0gbG9nZ2VyQ29uZmlnPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCBcIlVua25vd25Mb2dnZXJcIlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnZXIgbXVzdCBpbXBsZW1lbnQgdG9PdXRwdXRDb25maWcgb3Igd3JpdGU6ICR7bG9nZ2VyTmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBsb2dnZXJPdXRwdXRzXG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0cy5cbiAgICBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgY29uc3Qgb3V0cHV0cyA9IFtdXG4gIGlmIChsb2dnaW5nQ29uZmlndXJhdGlvbi5jb25zb2xlICE9PSBmYWxzZSkge1xuICAgIG91dHB1dHMucHVzaCh7XG4gICAgICBvdXRwdXQ6IG5ldyBMb2dnZXJDb25zb2xlT3V0cHV0KCksXG4gICAgICBsZXZlbHM6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVsc1xuICAgIH0pXG4gIH1cblxuICBpZiAobG9nZ2luZ0NvbmZpZ3VyYXRpb24uZmlsZSAhPT0gZmFsc2UgJiYgbG9nZ2luZ0NvbmZpZ3VyYXRpb24uZmlsZVBhdGgpIHtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgb3V0cHV0OiBuZXcgTG9nZ2VyRmlsZU91dHB1dCh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGdldENvbmZpZ3VyYXRpb246ICgpID0+IGNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGZpbGVQYXRoOiBsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlUGF0aFxuICAgICAgfSksXG4gICAgICBsZXZlbHM6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVsc1xuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0c1xufVxuXG4vKipcbiAqIFJ1bnMgaXMgb3V0cHV0IGxldmVsIGFsbG93ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ30gYXJncy5vdXRwdXRDb25maWcgLSBPdXRwdXQgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBhcmdzLmxvZ2dpbmdDb25maWd1cmF0aW9uIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBvdXRwdXQgc2hvdWxkIGxvZy5cbiAqL1xuZnVuY3Rpb24gaXNPdXRwdXRMZXZlbEFsbG93ZWQoe2xldmVsLCBvdXRwdXRDb25maWcsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG91dHB1dENvbmZpZy5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLmxldmVscywgZGVidWdGbGFnOiBmYWxzZX0pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRDb25maWcub3V0cHV0Py5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLm91dHB1dC5sZXZlbHMsIGRlYnVnRmxhZzogZmFsc2V9KVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZExldmVscyA9IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVscyB8fCBERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTi5sZXZlbHNcblxuICByZXR1cm4gaXNMZXZlbEFsbG93ZWQoe2xldmVsLCBhbGxvd2VkTGV2ZWxzLCBkZWJ1Z0ZsYWd9KVxufVxuXG4vKipcbiAqIFJ1bnMgZW5hYmxlZCBvdXRwdXQgY29uZmlncy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IGFyZ3Mub3V0cHV0cyAtIE91dHB1dCBjb25maWd1cmF0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBhcmdzLmxvZ2dpbmdDb25maWd1cmF0aW9uIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IC0gT3V0cHV0cyBlbmFibGVkIGZvciB0aGUgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGVuYWJsZWRPdXRwdXRDb25maWdzKHtsZXZlbCwgb3V0cHV0cywgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGRlYnVnRmxhZ30pIHtcbiAgcmV0dXJuIG91dHB1dHMuZmlsdGVyKChvdXRwdXRDb25maWcpID0+IHtcbiAgICBpZiAoIW91dHB1dENvbmZpZyB8fCAhb3V0cHV0Q29uZmlnLm91dHB1dCB8fCB0eXBlb2Ygb3V0cHV0Q29uZmlnLm91dHB1dC53cml0ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBpc091dHB1dExldmVsQWxsb3dlZCh7bGV2ZWwsIG91dHB1dENvbmZpZywgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGRlYnVnRmxhZ30pXG4gIH0pXG59XG5cbi8qKlxuICogUnVucyB3cml0ZSBsb2cuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3ViamVjdCAtIExvZyBzdWJqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBmdW5jdGlvbk9yTWVzc2FnZXM+fSBhcmdzLm1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWR9IGFyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb24gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnRmxhZ10gLSBXaGV0aGVyIGRlYnVnIGZsYWcuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUxvZyh7c3ViamVjdCwgbGV2ZWwsIG1lc3NhZ2VzLCBjb25maWd1cmF0aW9uLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgZGVidWdGbGFnfSkge1xuICBjb25zdCByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uID0gbG9nZ2luZ0NvbmZpZ3VyYXRpb24gfHwgcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gIGNvbnN0IG91dHB1dHMgPSByZXNvbHZlTG9nZ2luZ091dHB1dHMoe2xvZ2dpbmdDb25maWd1cmF0aW9uOiByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9ufSlcbiAgY29uc3QgZW5hYmxlZE91dHB1dHMgPSBlbmFibGVkT3V0cHV0Q29uZmlncyh7XG4gICAgbGV2ZWwsXG4gICAgb3V0cHV0cyxcbiAgICBsb2dnaW5nQ29uZmlndXJhdGlvbjogcmVzb2x2ZWRMb2dnaW5nQ29uZmlndXJhdGlvbixcbiAgICBkZWJ1Z0ZsYWdcbiAgfSlcblxuICBpZiAoZW5hYmxlZE91dHB1dHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBjb25zdCB3cml0ZXMgPSBbXVxuICAvKipcbiAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICBAdHlwZSB7QXJyYXk8Pz4gfCB1bmRlZmluZWR9ICovXG4gIGxldCByZXNvbHZlZE1lc3NhZ2VzXG4gIC8qKlxuICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXNzYWdlXG4gIC8qKlxuICAgKiBQYXlsb2FkLlxuICAgIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dFBheWxvYWQgfCBudWxsfSAqL1xuICBsZXQgcGF5bG9hZCA9IG51bGxcblxuICBmb3IgKGNvbnN0IG91dHB1dENvbmZpZyBvZiBlbmFibGVkT3V0cHV0cykge1xuICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgcmVzb2x2ZWRNZXNzYWdlcyA9IGZ1bmN0aW9uT3JNZXNzYWdlcyguLi5tZXNzYWdlcylcbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5yZXNvbHZlZE1lc3NhZ2VzKVxuICAgICAgLy8gc3ViamVjdCBpcyB0aGUgZmlyc3QgcG9zaXRpb25hbCBhcmcsIHRoZW4gdGhlIHVzZXIgbWVzc2FnZXNcbiAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgIGxldmVsLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXMucHVzaChvdXRwdXRDb25maWcub3V0cHV0LndyaXRlKHBheWxvYWQpKVxuICB9XG5cbiAgaWYgKHdyaXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICBhd2FpdCB3cml0ZXNbMF1cbiAgfSBlbHNlIGlmICh3cml0ZXMubGVuZ3RoID4gMSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdyaXRlcylcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3R9IG9iamVjdCAtIE9iamVjdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnXSAtIFdoZXRoZXIgZGVidWcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBbYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbl0gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvYmplY3QsIHtjb25maWd1cmF0aW9uLCBkZWJ1ZyA9IGZhbHNlLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5fZGVidWcgPSBkZWJ1Z1xuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5fbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSBsb2dnaW5nQ29uZmlndXJhdGlvblxuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG9iamVjdCB8fCBcIkVtcHR5U3RyaW5nXCJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb2JqZWN0ID0gb2JqZWN0XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJVbmtub3duQ2xhc3NcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRDb25maWd1cmF0aW9uKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3Qgb2JqZWN0V2l0aENvbmZpZyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7e2NvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH19ICovICh0aGlzLl9vYmplY3QpXG4gICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gb2JqZWN0V2l0aENvbmZpZz8uY29uZmlndXJhdGlvbiB8fCBjdXJyZW50Q29uZmlndXJhdGlvbigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNhZmUgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBzYWZlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBfc2FmZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGxldmVsIGVuYWJsZWQuXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGxldmVsIC0gTGV2ZWwuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW55IGNvbmZpZ3VyZWQgb3V0cHV0IGVtaXRzIHRoaXMgbGV2ZWwuXG4gICAqL1xuICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl9zYWZlQ29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9sb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZUxvZ2dpbmdPdXRwdXRzKHtsb2dnaW5nQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gZW5hYmxlZE91dHB1dENvbmZpZ3Moe1xuICAgICAgbGV2ZWwsXG4gICAgICBvdXRwdXRzLFxuICAgICAgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sXG4gICAgICBkZWJ1Z0ZsYWc6IHRoaXMuX2RlYnVnXG4gICAgfSkubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkZWJ1ZyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJkZWJ1Z1wiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZvLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5mbyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlYnVnIGxvdyBsZXZlbC5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlYnVnTG93TGV2ZWwoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZGVidWctbG93LWxldmVsXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZy5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGxvZyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVycm9yLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZXJyb3IoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZXJyb3JcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGRlYnVnLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld1ZhbHVlIC0gTmV3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWJ1ZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2RlYnVnID0gbmV3VmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdhcm4uXG4gICAqIEB0eXBlIHsoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZnVuY3Rpb25Pck1lc3NhZ2VzPikgPT4gUHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhcm4oLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwid2FyblwiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICAgKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF93cml0ZSh7bGV2ZWwsIG1lc3NhZ2VzfSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl9zYWZlQ29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9sb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHdyaXRlTG9nKHtcbiAgICAgIHN1YmplY3Q6IHRoaXMuX3N1YmplY3QsXG4gICAgICBsZXZlbCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgICAgZGVidWdGbGFnOiB0aGlzLl9kZWJ1Z1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -3,6 +3,7 @@
3
3
  */
4
4
  export default class SmtpMailerBackend {
5
5
  /**
6
+ * Runs constructor.
6
7
  * @param {object} args - Constructor args.
7
8
  * @param {SmtpConnectionOptions} args.connectionOptions - smtp-connection options.
8
9
  * @param {string} [args.defaultFrom] - Default from address.
@@ -14,6 +15,7 @@ export default class SmtpMailerBackend {
14
15
  connectionOptions: SmtpConnectionOptions;
15
16
  defaultFrom: string | undefined;
16
17
  /**
18
+ * Runs deliver.
17
19
  * @param {object} args - Delivery args.
18
20
  * @param {import("../index.js").MailerDeliveryPayload} args.payload - Mail delivery payload.
19
21
  * @param {import("../../configuration.js").default} [args.configuration] - Active configuration.
@@ -24,6 +26,9 @@ export default class SmtpMailerBackend {
24
26
  configuration?: import("../../configuration.js").default | undefined;
25
27
  }): Promise<void>;
26
28
  }
29
+ /**
30
+ * Defines this typedef.
31
+ */
27
32
  export type SmtpConnectionOptions = {
28
33
  auth?: Record<string, unknown>;
29
34
  [key: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../../src/mailer/backends/smtp.js"],"names":[],"mappings":"AAqCA;;GAEG;AACH;IACE;;;;OAIG;IACH,6DAHG;QAAoC,iBAAiB,EAA7C,qBAAqB;QACP,WAAW;KACnC,EAUA;IAFC,yCAA0C;IAC1C,gCAA8B;IAGhC;;;;;OAKG;IACH,iEAJG;QAA0D,OAAO,EAAzD,OAAO,aAAa,EAAE,qBAAqB;QACK,aAAa;KACrE,GAAU,OAAO,CAAC,IAAI,CAAC,CAyHzB;CACF;oCAnLa;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAC"}
1
+ {"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../../src/mailer/backends/smtp.js"],"names":[],"mappings":"AA0CA;;GAEG;AACH;IACE;;;;;OAKG;IACH,6DAHG;QAAoC,iBAAiB,EAA7C,qBAAqB;QACP,WAAW;KACnC,EAUA;IAFC,yCAA0C;IAC1C,gCAA8B;IAGhC;;;;;;OAMG;IACH,iEAJG;QAA0D,OAAO,EAAzD,OAAO,aAAa,EAAE,qBAAqB;QACK,aAAa;KACrE,GAAU,OAAO,CAAC,IAAI,CAAC,CA+HzB;CACF;;;;oCA9LW;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAC,CAAA;CAAC"}
@@ -1,8 +1,11 @@
1
1
  // @ts-check
2
2
  import restArgsError from "../../utils/rest-args-error.js";
3
- /** @typedef {{auth?: Record<string, unknown>, [key: string]: unknown}} SmtpConnectionOptions */
4
3
  /**
5
- * @param {any} value - Recipient input.
4
+ * Defines this typedef.
5
+ @typedef {{auth?: Record<string, ?>, [key: string]: ?}} SmtpConnectionOptions */
6
+ /**
7
+ * Runs normalize recipients.
8
+ * @param {?} value - Recipient input.
6
9
  * @returns {string[]} - Normalized recipients.
7
10
  */
8
11
  function normalizeRecipients(value) {
@@ -13,6 +16,7 @@ function normalizeRecipients(value) {
13
16
  return [value].filter((entry) => entry);
14
17
  }
15
18
  /**
19
+ * Runs header line.
16
20
  * @param {string} name - Header name.
17
21
  * @param {string | undefined} value - Header value.
18
22
  * @returns {string | null} - Header line.
@@ -23,6 +27,7 @@ function headerLine(name, value) {
23
27
  return `${name}: ${value}`;
24
28
  }
25
29
  /**
30
+ * Runs envelope address.
26
31
  * @param {string} address - Header or mailbox address.
27
32
  * @returns {string} - SMTP envelope mailbox.
28
33
  */
@@ -35,6 +40,7 @@ function envelopeAddress(address) {
35
40
  */
36
41
  export default class SmtpMailerBackend {
37
42
  /**
43
+ * Runs constructor.
38
44
  * @param {object} args - Constructor args.
39
45
  * @param {SmtpConnectionOptions} args.connectionOptions - smtp-connection options.
40
46
  * @param {string} [args.defaultFrom] - Default from address.
@@ -48,6 +54,7 @@ export default class SmtpMailerBackend {
48
54
  this.defaultFrom = defaultFrom;
49
55
  }
50
56
  /**
57
+ * Runs deliver.
51
58
  * @param {object} args - Delivery args.
52
59
  * @param {import("../index.js").MailerDeliveryPayload} args.payload - Mail delivery payload.
53
60
  * @param {import("../../configuration.js").default} [args.configuration] - Active configuration.
@@ -99,6 +106,7 @@ export default class SmtpMailerBackend {
99
106
  resolve(undefined);
100
107
  };
101
108
  /**
109
+ * Reject delivery.
102
110
  * @param {Error} error - Error that failed delivery.
103
111
  */
104
112
  const rejectDelivery = (error) => {
@@ -111,6 +119,7 @@ export default class SmtpMailerBackend {
111
119
  };
112
120
  const onEnd = () => resolveDelivery();
113
121
  /**
122
+ * On error.
114
123
  * @param {Error} error - Error emitted by the SMTP connection.
115
124
  */
116
125
  const onError = (error) => {
@@ -126,7 +135,11 @@ export default class SmtpMailerBackend {
126
135
  connection.quit();
127
136
  };
128
137
  const sendMessage = () => {
129
- connection.send({ from: envelopeFrom, to: recipients }, /** @type {any} */ (message), (/** @type {Error | null | undefined} */ sendError) => {
138
+ connection.send({ from: envelopeFrom, to: recipients }, /**
139
+ * Narrows the runtime value to the documented type.
140
+ @type {?} */ (message), (/**
141
+ * Narrows the runtime value to the documented type.
142
+ @type {Error | null | undefined} */ sendError) => {
130
143
  if (sendError) {
131
144
  rejectDelivery(sendError);
132
145
  return;
@@ -152,4 +165,4 @@ export default class SmtpMailerBackend {
152
165
  });
153
166
  }
154
167
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWlsZXIvYmFja2VuZHMvc210cC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFFMUQsZ0dBQWdHO0FBRWhHOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSztJQUNoQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDN0IsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV2QixPQUFPLEdBQUcsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFBO0FBQzVCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFPO0lBQzlCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7SUFFekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGlCQUFpQjtJQUNwQzs7OztPQUlHO0lBQ0gsWUFBWSxFQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFB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QUFBO1lBQ0osQ0FBQyxDQUFBO1lBRUQsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDL0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKiogQHR5cGVkZWYge3thdXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFtrZXk6IHN0cmluZ106IHVua25vd259fSBTbXRwQ29ubmVjdGlvbk9wdGlvbnMgKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBSZWNpcGllbnQgaW5wdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gTm9ybWFsaXplZCByZWNpcGllbnRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWNpcGllbnRzKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSlcbiAgcmV0dXJuIFt2YWx1ZV0uZmlsdGVyKChlbnRyeSkgPT4gZW50cnkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBIZWFkZXIgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIEhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEhlYWRlciBsaW5lLlxuICovXG5mdW5jdGlvbiBoZWFkZXJMaW5lKG5hbWUsIHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGAke25hbWV9OiAke3ZhbHVlfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEhlYWRlciBvciBtYWlsYm94IGFkZHJlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNNVFAgZW52ZWxvcGUgbWFpbGJveC5cbiAqL1xuZnVuY3Rpb24gZW52ZWxvcGVBZGRyZXNzKGFkZHJlc3MpIHtcbiAgY29uc3QgbWF0Y2ggPSBhZGRyZXNzLm1hdGNoKC88KFtePD5dKyk+LylcblxuICByZXR1cm4gKG1hdGNoID8gbWF0Y2hbMV0gOiBhZGRyZXNzKS50cmltKClcbn1cblxuLyoqXG4gKiBTTVRQIG1haWxlciBiYWNrZW5kIHVzaW5nIHNtdHAtY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU210cE1haWxlckJhY2tlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDb25zdHJ1Y3RvciBhcmdzLlxuICAgKiBAcGFyYW0ge1NtdHBDb25uZWN0aW9uT3B0aW9uc30gYXJncy5jb25uZWN0aW9uT3B0aW9ucyAtIHNtdHAtY29ubmVjdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGVmYXVsdEZyb21dIC0gRGVmYXVsdCBmcm9tIGFkZHJlc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29ubmVjdGlvbk9wdGlvbnMsIGRlZmF1bHRGcm9tLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCFjb25uZWN0aW9uT3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHNtdHAgY29ubmVjdGlvbiBvcHRpb25zLiBHb3Q6ICR7U3RyaW5nKGNvbm5lY3Rpb25PcHRpb25zKX1gKVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbk9wdGlvbnMgPSBjb25uZWN0aW9uT3B0aW9uc1xuICAgIHRoaXMuZGVmYXVsdEZyb20gPSBkZWZhdWx0RnJvbVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRGVsaXZlcnkgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IGFyZ3MucGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQWN0aXZlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkZWxpdmVyKHtwYXlsb2FkLCBjb25maWd1cmF0aW9uOiBfY29uZmlndXJhdGlvbiwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGZyb20gPSBwYXlsb2FkLmZyb20gfHwgdGhpcy5kZWZhdWx0RnJvbVxuXG4gICAgaWYgKCFmcm9tKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgbWFpbCBcImZyb21cIiBhZGRyZXNzLiBHb3Q6ICR7U3RyaW5nKGZyb20pfWApXG4gICAgfVxuXG4gICAgY29uc3QgZW52ZWxvcGVGcm9tID0gZW52ZWxvcGVBZGRyZXNzKFN0cmluZyhmcm9tKSlcblxuICAgIGNvbnN0IHRvTGlzdCA9IG5vcm1hbGl6ZVJlY2lwaWVudHMocGF5bG9hZC50bylcbiAgICBjb25zdCBjY0xpc3QgPSBub3JtYWxpemVSZWNpcGllbnRzKHBheWxvYWQuY2MpXG4gICAgY29uc3QgYmNjTGlzdCA9IG5vcm1hbGl6ZVJlY2lwaWVudHMocGF5bG9hZC5iY2MpXG4gICAgY29uc3QgcmVjaXBpZW50cyA9IFsuLi50b0xpc3QsIC4uLmNjTGlzdCwgLi4uYmNjTGlzdF1cblxuICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwgcmVjaXBpZW50cy4gR290OiAke0pTT04uc3RyaW5naWZ5KHt0bzogcGF5bG9hZC50bywgY2M6IHBheWxvYWQuY2MsIGJjYzogcGF5bG9hZC5iY2N9KX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBoZWFkZXJMaW5lKFwiRnJvbVwiLCBmcm9tKSxcbiAgICAgIGhlYWRlckxpbmUoXCJUb1wiLCB0b0xpc3QubGVuZ3RoID4gMCA/IHRvTGlzdC5qb2luKFwiLCBcIikgOiB1bmRlZmluZWQpLFxuICAgICAgaGVhZGVyTGluZShcIkNjXCIsIGNjTGlzdC5sZW5ndGggPiAwID8gY2NMaXN0LmpvaW4oXCIsIFwiKSA6IHVuZGVmaW5lZCksXG4gICAgICBoZWFkZXJMaW5lKFwiU3ViamVjdFwiLCBwYXlsb2FkLnN1YmplY3QpLFxuICAgICAgXCJNSU1FLVZlcnNpb246IDEuMFwiLFxuICAgICAgXCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiXG4gICAgXS5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG5cbiAgICBpZiAocGF5bG9hZC5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGF5bG9hZC5oZWFkZXJzKSkge1xuICAgICAgICBoZWFkZXJzLnB1c2goYCR7aGVhZGVyTmFtZX06ICR7aGVhZGVyVmFsdWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYCR7aGVhZGVycy5qb2luKFwiXFxyXFxuXCIpfVxcclxcblxcclxcbiR7cGF5bG9hZC5odG1sfWBcbiAgICBjb25zdCB7ZGVmYXVsdDogU210cENvbm5lY3Rpb259ID0gYXdhaXQgaW1wb3J0KFwic210cC1jb25uZWN0aW9uXCIpXG4gICAgY29uc3QgY29ubmVjdGlvbk9wdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25PcHRpb25zXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBTbXRwQ29ubmVjdGlvbihjb25uZWN0aW9uT3B0aW9ucylcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICAgIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsIG9uRW5kKVxuICAgICAgICBjb25uZWN0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzb2x2ZURlbGl2ZXJ5ID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgdGhhdCBmYWlsZWQgZGVsaXZlcnkuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHJlamVjdERlbGl2ZXJ5ID0gKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZVxuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25FbmQgPSAoKSA9PiByZXNvbHZlRGVsaXZlcnkoKVxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgZW1pdHRlZCBieSB0aGUgU01UUCBjb25uZWN0aW9uLlxuICAgICAgICovXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICByZXNvbHZlRGVsaXZlcnkoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVqZWN0RGVsaXZlcnkoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1aXRBZnRlckFjY2VwdGVkTWVzc2FnZSA9ICgpID0+IHtcbiAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZVxuICAgICAgICBjb25uZWN0aW9uLm9uY2UoXCJlbmRcIiwgb25FbmQpXG4gICAgICAgIGNvbm5lY3Rpb24ucXVpdCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbmRNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICBjb25uZWN0aW9uLnNlbmQoe2Zyb206IGVudmVsb3BlRnJvbSwgdG86IHJlY2lwaWVudHN9LCAvKiogQHR5cGUge2FueX0gKi8gKG1lc3NhZ2UpLCAoLyoqIEB0eXBlIHtFcnJvciB8IG51bGwgfCB1bmRlZmluZWR9ICovIHNlbmRFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChzZW5kRXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdERlbGl2ZXJ5KHNlbmRFcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHF1aXRBZnRlckFjY2VwdGVkTWVzc2FnZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0ZUFuZFNlbmQgPSAoKSA9PiB7XG4gICAgICAgIGlmICghY29ubmVjdGlvbk9wdGlvbnMuYXV0aCkge1xuICAgICAgICAgIHNlbmRNZXNzYWdlKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9naW4oY29ubmVjdGlvbk9wdGlvbnMuYXV0aCwgKGxvZ2luRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAobG9naW5FcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0RGVsaXZlcnkobG9naW5FcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbmRNZXNzYWdlKClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29ubmVjdGlvbi5vbihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICBjb25uZWN0aW9uLmNvbm5lY3QoYXV0aGVudGljYXRlQW5kU2VuZClcbiAgICB9KVxuICB9XG59XG4iXX0=
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWlsZXIvYmFja2VuZHMvc210cC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFFMUQ7O2tGQUVrRjtBQUVsRjs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ2hDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDL0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDekMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDN0IsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV2QixPQUFPLEdBQUcsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFBO0FBQzVCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsT0FBTztJQUM5QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRXpDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDNUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxpQkFBaUI7SUFDcEM7Ozs7O09BS0c7SUFDSCxZQUFZLEVBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ3ZELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdkYsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQ2pFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUE7UUFFN0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN0RSxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRWxELE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDOUMsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQTtRQUVyRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEgsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHO1lBQ2QsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDeEIsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdEMsbUJBQW1CO1lBQ25CLHdDQUF3QztTQUN6QyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFeEIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUMsQ0FBQTtZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDaEUsTUFBTSxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2pFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFBO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFeEQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7WUFDbkIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO1lBRXhCLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRTtnQkFDbkIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQ3ZDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzdDLENBQUMsQ0FBQTtZQUVELE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtnQkFDM0IsSUFBSSxPQUFPO29CQUFFLE9BQU07Z0JBRW5CLE9BQU8sR0FBRyxJQUFJLENBQUE7Z0JBQ2QsT0FBTyxFQUFFLENBQUE7Z0JBQ1QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3BCLENBQUMsQ0FBQTtZQUVEOzs7ZUFHRztZQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLElBQUksT0FBTztvQkFBRSxPQUFNO2dCQUVuQixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLE9BQU8sRUFBRSxDQUFBO2dCQUNULFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtnQkFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2YsQ0FBQyxDQUFBO1lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUE7WUFFckM7OztlQUdHO1lBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsZUFBZSxFQUFFLENBQUE7b0JBQ2pCLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdkIsQ0FBQyxDQUFBO1lBRUQsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BDLFlBQVksR0FBRyxJQUFJLENBQUE7Z0JBQ25CLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUM3QixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbkIsQ0FBQyxDQUFBO1lBRUQsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO2dCQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFDLEVBQUU7O29GQUVjLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDOzs4RUFFcUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDbEksSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDZCxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7d0JBQ3pCLE9BQU07b0JBQ1IsQ0FBQztvQkFFRCx3QkFBd0IsRUFBRSxDQUFBO2dCQUM1QixDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQTtZQUVELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFO2dCQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzVCLFdBQVcsRUFBRSxDQUFBO29CQUNiLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUN0RCxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQTt3QkFDMUIsT0FBTTtvQkFDUixDQUFDO29CQUVELFdBQVcsRUFBRSxDQUFBO2dCQUNmLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFBO1lBRUQsVUFBVSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDL0IsVUFBVSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi8uLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICBAdHlwZWRlZiB7e2F1dGg/OiBSZWNvcmQ8c3RyaW5nLCA/PiwgW2tleTogc3RyaW5nXTogP319IFNtdHBDb25uZWN0aW9uT3B0aW9ucyAqL1xuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHJlY2lwaWVudHMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gUmVjaXBpZW50IGlucHV0LlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgcmVjaXBpZW50cy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVjaXBpZW50cyh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkpXG4gIHJldHVybiBbdmFsdWVdLmZpbHRlcigoZW50cnkpID0+IGVudHJ5KVxufVxuXG4vKipcbiAqIFJ1bnMgaGVhZGVyIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEhlYWRlciBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gSGVhZGVyIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gSGVhZGVyIGxpbmUuXG4gKi9cbmZ1bmN0aW9uIGhlYWRlckxpbmUobmFtZSwgdmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gYCR7bmFtZX06ICR7dmFsdWV9YFxufVxuXG4vKipcbiAqIFJ1bnMgZW52ZWxvcGUgYWRkcmVzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gSGVhZGVyIG9yIG1haWxib3ggYWRkcmVzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU01UUCBlbnZlbG9wZSBtYWlsYm94LlxuICovXG5mdW5jdGlvbiBlbnZlbG9wZUFkZHJlc3MoYWRkcmVzcykge1xuICBjb25zdCBtYXRjaCA9IGFkZHJlc3MubWF0Y2goLzwoW148Pl0rKT4vKVxuXG4gIHJldHVybiAobWF0Y2ggPyBtYXRjaFsxXSA6IGFkZHJlc3MpLnRyaW0oKVxufVxuXG4vKipcbiAqIFNNVFAgbWFpbGVyIGJhY2tlbmQgdXNpbmcgc210cC1jb25uZWN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXRwTWFpbGVyQmFja2VuZCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIENvbnN0cnVjdG9yIGFyZ3MuXG4gICAqIEBwYXJhbSB7U210cENvbm5lY3Rpb25PcHRpb25zfSBhcmdzLmNvbm5lY3Rpb25PcHRpb25zIC0gc210cC1jb25uZWN0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kZWZhdWx0RnJvbV0gLSBEZWZhdWx0IGZyb20gYWRkcmVzcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25uZWN0aW9uT3B0aW9ucywgZGVmYXVsdEZyb20sIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIWNvbm5lY3Rpb25PcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgc210cCBjb25uZWN0aW9uIG9wdGlvbnMuIEdvdDogJHtTdHJpbmcoY29ubmVjdGlvbk9wdGlvbnMpfWApXG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9uT3B0aW9ucyA9IGNvbm5lY3Rpb25PcHRpb25zXG4gICAgdGhpcy5kZWZhdWx0RnJvbSA9IGRlZmF1bHRGcm9tXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxpdmVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIERlbGl2ZXJ5IGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBhcmdzLnBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIEFjdGl2ZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGVsaXZlcih7cGF5bG9hZCwgY29uZmlndXJhdGlvbjogX2NvbmZpZ3VyYXRpb24sIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCBmcm9tID0gcGF5bG9hZC5mcm9tIHx8IHRoaXMuZGVmYXVsdEZyb21cblxuICAgIGlmICghZnJvbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwgXCJmcm9tXCIgYWRkcmVzcy4gR290OiAke1N0cmluZyhmcm9tKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGVudmVsb3BlRnJvbSA9IGVudmVsb3BlQWRkcmVzcyhTdHJpbmcoZnJvbSkpXG5cbiAgICBjb25zdCB0b0xpc3QgPSBub3JtYWxpemVSZWNpcGllbnRzKHBheWxvYWQudG8pXG4gICAgY29uc3QgY2NMaXN0ID0gbm9ybWFsaXplUmVjaXBpZW50cyhwYXlsb2FkLmNjKVxuICAgIGNvbnN0IGJjY0xpc3QgPSBub3JtYWxpemVSZWNpcGllbnRzKHBheWxvYWQuYmNjKVxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbLi4udG9MaXN0LCAuLi5jY0xpc3QsIC4uLmJjY0xpc3RdXG5cbiAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBtYWlsIHJlY2lwaWVudHMuIEdvdDogJHtKU09OLnN0cmluZ2lmeSh7dG86IHBheWxvYWQudG8sIGNjOiBwYXlsb2FkLmNjLCBiY2M6IHBheWxvYWQuYmNjfSl9YClcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgaGVhZGVyTGluZShcIkZyb21cIiwgZnJvbSksXG4gICAgICBoZWFkZXJMaW5lKFwiVG9cIiwgdG9MaXN0Lmxlbmd0aCA+IDAgPyB0b0xpc3Quam9pbihcIiwgXCIpIDogdW5kZWZpbmVkKSxcbiAgICAgIGhlYWRlckxpbmUoXCJDY1wiLCBjY0xpc3QubGVuZ3RoID4gMCA/IGNjTGlzdC5qb2luKFwiLCBcIikgOiB1bmRlZmluZWQpLFxuICAgICAgaGVhZGVyTGluZShcIlN1YmplY3RcIiwgcGF5bG9hZC5zdWJqZWN0KSxcbiAgICAgIFwiTUlNRS1WZXJzaW9uOiAxLjBcIixcbiAgICAgIFwiQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIlxuICAgIF0uZmlsdGVyKChsaW5lKSA9PiBsaW5lKVxuXG4gICAgaWYgKHBheWxvYWQuaGVhZGVycykge1xuICAgICAgZm9yIChjb25zdCBbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBheWxvYWQuaGVhZGVycykpIHtcbiAgICAgICAgaGVhZGVycy5wdXNoKGAke2hlYWRlck5hbWV9OiAke2hlYWRlclZhbHVlfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGAke2hlYWRlcnMuam9pbihcIlxcclxcblwiKX1cXHJcXG5cXHJcXG4ke3BheWxvYWQuaHRtbH1gXG4gICAgY29uc3Qge2RlZmF1bHQ6IFNtdHBDb25uZWN0aW9ufSA9IGF3YWl0IGltcG9ydChcInNtdHAtY29ubmVjdGlvblwiKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gdGhpcy5jb25uZWN0aW9uT3B0aW9uc1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgU210cENvbm5lY3Rpb24oY29ubmVjdGlvbk9wdGlvbnMpXG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2VcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY29ubmVjdGlvbi5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLCBvbkVuZClcbiAgICAgICAgY29ubmVjdGlvbi5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc29sdmVEZWxpdmVyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVyblxuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBSZWplY3QgZGVsaXZlcnkuXG4gICAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRoYXQgZmFpbGVkIGRlbGl2ZXJ5LlxuICAgICAgICovXG4gICAgICBjb25zdCByZWplY3REZWxpdmVyeSA9IChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uRW5kID0gKCkgPT4gcmVzb2x2ZURlbGl2ZXJ5KClcblxuICAgICAgLyoqXG4gICAgICAgKiBPbiBlcnJvci5cbiAgICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgZW1pdHRlZCBieSB0aGUgU01UUCBjb25uZWN0aW9uLlxuICAgICAgICovXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzaHV0dGluZ0Rvd24pIHtcbiAgICAgICAgICByZXNvbHZlRGVsaXZlcnkoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVqZWN0RGVsaXZlcnkoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1aXRBZnRlckFjY2VwdGVkTWVzc2FnZSA9ICgpID0+IHtcbiAgICAgICAgc2h1dHRpbmdEb3duID0gdHJ1ZVxuICAgICAgICBjb25uZWN0aW9uLm9uY2UoXCJlbmRcIiwgb25FbmQpXG4gICAgICAgIGNvbm5lY3Rpb24ucXVpdCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbmRNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICBjb25uZWN0aW9uLnNlbmQoe2Zyb206IGVudmVsb3BlRnJvbSwgdG86IHJlY2lwaWVudHN9LCAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAobWVzc2FnZSksICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtFcnJvciB8IG51bGwgfCB1bmRlZmluZWR9ICovIHNlbmRFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChzZW5kRXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdERlbGl2ZXJ5KHNlbmRFcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHF1aXRBZnRlckFjY2VwdGVkTWVzc2FnZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhlbnRpY2F0ZUFuZFNlbmQgPSAoKSA9PiB7XG4gICAgICAgIGlmICghY29ubmVjdGlvbk9wdGlvbnMuYXV0aCkge1xuICAgICAgICAgIHNlbmRNZXNzYWdlKClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9naW4oY29ubmVjdGlvbk9wdGlvbnMuYXV0aCwgKGxvZ2luRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAobG9naW5FcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0RGVsaXZlcnkobG9naW5FcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbmRNZXNzYWdlKClcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29ubmVjdGlvbi5vbihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICBjb25uZWN0aW9uLmNvbm5lY3QoYXV0aGVudGljYXRlQW5kU2VuZClcbiAgICB9KVxuICB9XG59XG4iXX0=