velocious 1.0.430 → 1.0.432

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 (831) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/application.js +229 -0
  3. package/build/authorization/ability.js +329 -0
  4. package/build/authorization/base-resource.js +143 -0
  5. package/build/background-jobs/client.js +50 -0
  6. package/build/background-jobs/cron-expression.js +277 -0
  7. package/build/background-jobs/forked-runner-child.js +86 -0
  8. package/build/background-jobs/job-record.js +13 -0
  9. package/build/background-jobs/job-registry.js +92 -0
  10. package/build/background-jobs/job-runner.js +107 -0
  11. package/build/background-jobs/job.js +77 -0
  12. package/build/background-jobs/json-socket.js +78 -0
  13. package/build/background-jobs/main.js +926 -0
  14. package/build/background-jobs/normalize-error.js +26 -0
  15. package/build/background-jobs/scheduler.js +274 -0
  16. package/build/background-jobs/socket-request.js +68 -0
  17. package/build/background-jobs/status-reporter.js +101 -0
  18. package/build/background-jobs/store.js +994 -0
  19. package/build/background-jobs/types.js +70 -0
  20. package/build/background-jobs/web/authorization.js +89 -0
  21. package/build/background-jobs/web/controller.js +280 -0
  22. package/build/background-jobs/web/index.js +57 -0
  23. package/build/background-jobs/web/path-matcher.js +74 -0
  24. package/build/background-jobs/web/registry.js +49 -0
  25. package/build/background-jobs/worker.js +683 -0
  26. package/build/beacon/client.js +330 -0
  27. package/build/beacon/in-process-broker.js +71 -0
  28. package/build/beacon/in-process-client.js +139 -0
  29. package/build/beacon/server.js +148 -0
  30. package/build/beacon/types.js +55 -0
  31. package/build/bin/velocious.js +39 -34
  32. package/build/cli/base-command.js +67 -0
  33. package/build/cli/browser-cli.js +45 -0
  34. package/build/cli/commands/background-jobs-main.js +7 -0
  35. package/build/cli/commands/background-jobs-runner.js +7 -0
  36. package/build/cli/commands/background-jobs-worker.js +7 -0
  37. package/build/cli/commands/beacon.js +7 -0
  38. package/build/cli/commands/console.js +12 -0
  39. package/build/cli/commands/db/base-command.js +82 -0
  40. package/build/cli/commands/db/create.js +64 -0
  41. package/build/cli/commands/db/drop.js +75 -0
  42. package/build/cli/commands/db/migrate.js +17 -0
  43. package/build/cli/commands/db/reset.js +22 -0
  44. package/build/cli/commands/db/rollback.js +15 -0
  45. package/build/cli/commands/db/schema/dump.js +12 -0
  46. package/build/cli/commands/db/schema/load.js +12 -0
  47. package/build/cli/commands/db/seed.js +12 -0
  48. package/build/cli/commands/db/tenants/check.js +38 -0
  49. package/build/cli/commands/db/tenants/create.js +33 -0
  50. package/build/cli/commands/db/tenants/migrate.js +49 -0
  51. package/build/cli/commands/destroy/migration.js +7 -0
  52. package/build/cli/commands/generate/base-models.js +7 -0
  53. package/build/cli/commands/generate/frontend-models.js +12 -0
  54. package/build/cli/commands/generate/migration.js +7 -0
  55. package/build/cli/commands/generate/model.js +7 -0
  56. package/build/cli/commands/init.js +11 -0
  57. package/build/cli/commands/routes.js +7 -0
  58. package/build/cli/commands/run-script.js +12 -0
  59. package/build/cli/commands/runner.js +12 -0
  60. package/build/cli/commands/server.js +7 -0
  61. package/build/cli/commands/test.js +9 -0
  62. package/build/cli/index.js +152 -0
  63. package/build/cli/tenant-database-command-helper.js +198 -0
  64. package/build/cli/use-browser-cli.js +30 -0
  65. package/build/configuration-resolver.js +65 -0
  66. package/build/configuration-types.js +429 -0
  67. package/build/configuration.js +2590 -0
  68. package/build/controller.js +421 -0
  69. package/build/current-configuration.js +31 -0
  70. package/build/current.js +80 -0
  71. package/build/database/annotations-async-hooks.js +47 -0
  72. package/build/database/annotations.js +40 -0
  73. package/build/database/drivers/base-column.js +182 -0
  74. package/build/database/drivers/base-columns-index.js +81 -0
  75. package/build/database/drivers/base-foreign-key.js +104 -0
  76. package/build/database/drivers/base-table.js +156 -0
  77. package/build/database/drivers/base.js +1609 -0
  78. package/build/database/drivers/mssql/column.js +74 -0
  79. package/build/database/drivers/mssql/columns-index.js +6 -0
  80. package/build/database/drivers/mssql/connect-connection.js +16 -0
  81. package/build/database/drivers/mssql/foreign-key.js +12 -0
  82. package/build/database/drivers/mssql/index.js +590 -0
  83. package/build/database/drivers/mssql/options.js +79 -0
  84. package/build/database/drivers/mssql/query-parser.js +6 -0
  85. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  87. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  88. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  89. package/build/database/drivers/mssql/sql/delete.js +19 -0
  90. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  91. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  92. package/build/database/drivers/mssql/sql/insert.js +4 -0
  93. package/build/database/drivers/mssql/sql/update.js +31 -0
  94. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  95. package/build/database/drivers/mssql/structure-sql.js +120 -0
  96. package/build/database/drivers/mssql/table.js +145 -0
  97. package/build/database/drivers/mysql/column.js +112 -0
  98. package/build/database/drivers/mysql/columns-index.js +22 -0
  99. package/build/database/drivers/mysql/foreign-key.js +12 -0
  100. package/build/database/drivers/mysql/index.js +473 -0
  101. package/build/database/drivers/mysql/options.js +34 -0
  102. package/build/database/drivers/mysql/query-parser.js +6 -0
  103. package/build/database/drivers/mysql/query.js +37 -0
  104. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  106. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  107. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  108. package/build/database/drivers/mysql/sql/delete.js +21 -0
  109. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  110. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  111. package/build/database/drivers/mysql/sql/insert.js +6 -0
  112. package/build/database/drivers/mysql/sql/update.js +33 -0
  113. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  114. package/build/database/drivers/mysql/structure-sql.js +93 -0
  115. package/build/database/drivers/mysql/table.js +121 -0
  116. package/build/database/drivers/pgsql/column.js +90 -0
  117. package/build/database/drivers/pgsql/columns-index.js +6 -0
  118. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  119. package/build/database/drivers/pgsql/index.js +441 -0
  120. package/build/database/drivers/pgsql/options.js +32 -0
  121. package/build/database/drivers/pgsql/query-parser.js +6 -0
  122. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  124. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  125. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  126. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  127. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  128. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  129. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  130. package/build/database/drivers/pgsql/sql/update.js +33 -0
  131. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  132. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  133. package/build/database/drivers/pgsql/table.js +135 -0
  134. package/build/database/drivers/sqlite/base.js +509 -0
  135. package/build/database/drivers/sqlite/column.js +75 -0
  136. package/build/database/drivers/sqlite/columns-index.js +30 -0
  137. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  138. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  139. package/build/database/drivers/sqlite/index.js +394 -0
  140. package/build/database/drivers/sqlite/index.native.js +72 -0
  141. package/build/database/drivers/sqlite/index.web.js +99 -0
  142. package/build/database/drivers/sqlite/options.js +32 -0
  143. package/build/database/drivers/sqlite/query-parser.js +6 -0
  144. package/build/database/drivers/sqlite/query.js +35 -0
  145. package/build/database/drivers/sqlite/query.native.js +35 -0
  146. package/build/database/drivers/sqlite/query.web.js +49 -0
  147. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  148. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  149. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  151. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  152. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  153. package/build/database/drivers/sqlite/sql/update.js +33 -0
  154. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  155. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  156. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  157. package/build/database/drivers/sqlite/table.js +131 -0
  158. package/build/database/drivers/structure-sql/utils.js +35 -0
  159. package/build/database/handler.js +13 -0
  160. package/build/database/initializer-from-require-context.js +101 -0
  161. package/build/database/migration/index.js +438 -0
  162. package/build/database/migrator/files-finder.js +55 -0
  163. package/build/database/migrator/types.js +31 -0
  164. package/build/database/migrator.js +557 -0
  165. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  166. package/build/database/pool/base-methods-forward.js +52 -0
  167. package/build/database/pool/base.js +380 -0
  168. package/build/database/pool/single-multi-use.js +118 -0
  169. package/build/database/query/alter-table-base.js +104 -0
  170. package/build/database/query/base.js +49 -0
  171. package/build/database/query/create-database-base.js +42 -0
  172. package/build/database/query/create-index-base.js +117 -0
  173. package/build/database/query/create-table-base.js +205 -0
  174. package/build/database/query/delete-base.js +19 -0
  175. package/build/database/query/drop-database-base.js +38 -0
  176. package/build/database/query/drop-table-base.js +58 -0
  177. package/build/database/query/from-base.js +36 -0
  178. package/build/database/query/from-plain.js +16 -0
  179. package/build/database/query/from-table.js +18 -0
  180. package/build/database/query/index.js +533 -0
  181. package/build/database/query/insert-base.js +172 -0
  182. package/build/database/query/join-base.js +43 -0
  183. package/build/database/query/join-object.js +167 -0
  184. package/build/database/query/join-plain.js +18 -0
  185. package/build/database/query/join-tracker.js +93 -0
  186. package/build/database/query/model-class-query.js +1577 -0
  187. package/build/database/query/order-base.js +33 -0
  188. package/build/database/query/order-column.js +77 -0
  189. package/build/database/query/order-plain.js +28 -0
  190. package/build/database/query/preloader/belongs-to.js +267 -0
  191. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  192. package/build/database/query/preloader/has-many.js +316 -0
  193. package/build/database/query/preloader/has-one.js +123 -0
  194. package/build/database/query/preloader/selection.js +152 -0
  195. package/build/database/query/preloader.js +201 -0
  196. package/build/database/query/query-data.js +305 -0
  197. package/build/database/query/select-base.js +30 -0
  198. package/build/database/query/select-plain.js +18 -0
  199. package/build/database/query/select-table-and-column.js +28 -0
  200. package/build/database/query/update-base.js +41 -0
  201. package/build/database/query/upsert-base.js +103 -0
  202. package/build/database/query/where-base.js +38 -0
  203. package/build/database/query/where-combinator.js +31 -0
  204. package/build/database/query/where-hash.js +77 -0
  205. package/build/database/query/where-model-class-hash.js +505 -0
  206. package/build/database/query/where-not.js +23 -0
  207. package/build/database/query/where-plain.js +20 -0
  208. package/build/database/query/with-count.js +219 -0
  209. package/build/database/query-parser/base-query-parser.js +40 -0
  210. package/build/database/query-parser/from-parser.js +49 -0
  211. package/build/database/query-parser/group-parser.js +55 -0
  212. package/build/database/query-parser/joins-parser.js +37 -0
  213. package/build/database/query-parser/limit-parser.js +77 -0
  214. package/build/database/query-parser/options.js +94 -0
  215. package/build/database/query-parser/order-parser.js +45 -0
  216. package/build/database/query-parser/select-parser.js +67 -0
  217. package/build/database/query-parser/where-parser.js +46 -0
  218. package/build/database/record/acts-as-list.js +374 -0
  219. package/build/database/record/attachments/download.js +49 -0
  220. package/build/database/record/attachments/handle.js +188 -0
  221. package/build/database/record/attachments/normalize-input.js +213 -0
  222. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  223. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  224. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  225. package/build/database/record/attachments/store.js +591 -0
  226. package/build/database/record/index.js +4094 -0
  227. package/build/database/record/instance-relationships/base.js +289 -0
  228. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  229. package/build/database/record/instance-relationships/has-many.js +284 -0
  230. package/build/database/record/instance-relationships/has-one.js +117 -0
  231. package/build/database/record/record-not-found-error.js +3 -0
  232. package/build/database/record/relationships/base.js +195 -0
  233. package/build/database/record/relationships/belongs-to.js +57 -0
  234. package/build/database/record/relationships/has-many.js +46 -0
  235. package/build/database/record/relationships/has-one.js +46 -0
  236. package/build/database/record/state-machine.js +278 -0
  237. package/build/database/record/user-module.js +43 -0
  238. package/build/database/record/validators/base.js +27 -0
  239. package/build/database/record/validators/format.js +50 -0
  240. package/build/database/record/validators/presence.js +24 -0
  241. package/build/database/record/validators/uniqueness.js +124 -0
  242. package/build/database/table-data/index.js +241 -0
  243. package/build/database/table-data/table-column.js +416 -0
  244. package/build/database/table-data/table-foreign-key.js +69 -0
  245. package/build/database/table-data/table-index.js +46 -0
  246. package/build/database/table-data/table-reference.js +13 -0
  247. package/build/database/use-database.js +48 -0
  248. package/build/environment-handlers/base.js +561 -0
  249. package/build/environment-handlers/browser.js +338 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  251. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  252. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  253. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  254. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  255. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  256. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  257. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  258. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  259. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  260. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  261. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  262. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  263. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  264. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  265. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  266. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  267. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  268. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  269. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  270. package/build/environment-handlers/node.js +887 -0
  271. package/build/error-logger.js +30 -0
  272. package/build/frontend-model-controller.js +3491 -0
  273. package/build/frontend-model-resource/base-resource.js +935 -0
  274. package/build/frontend-models/base.js +4004 -0
  275. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  276. package/build/frontend-models/event-hook-models.js +49 -0
  277. package/build/frontend-models/model-registry.js +28 -0
  278. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  279. package/build/frontend-models/preloader.js +169 -0
  280. package/build/frontend-models/query.js +2245 -0
  281. package/build/frontend-models/resource-config-validation.js +56 -0
  282. package/build/frontend-models/resource-definition.js +399 -0
  283. package/build/frontend-models/transport-serialization.js +369 -0
  284. package/build/frontend-models/use-created-event.js +21 -0
  285. package/build/frontend-models/use-destroyed-event.js +148 -0
  286. package/build/frontend-models/use-model-class-event.js +164 -0
  287. package/build/frontend-models/use-updated-event.js +152 -0
  288. package/build/frontend-models/websocket-channel.js +494 -0
  289. package/build/frontend-models/websocket-publishers.js +224 -0
  290. package/build/http-client/header.js +17 -0
  291. package/build/http-client/index.js +139 -0
  292. package/build/http-client/request.js +94 -0
  293. package/build/http-client/response.js +151 -0
  294. package/build/http-client/websocket-client.js +27 -0
  295. package/build/http-server/client/index.js +507 -0
  296. package/build/http-server/client/params-to-object.js +152 -0
  297. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  298. package/build/http-server/client/request-buffer/header.js +19 -0
  299. package/build/http-server/client/request-buffer/index.js +535 -0
  300. package/build/http-server/client/request-parser.js +195 -0
  301. package/build/http-server/client/request-runner.js +321 -0
  302. package/build/http-server/client/request-timing.js +171 -0
  303. package/build/http-server/client/request.js +114 -0
  304. package/build/http-server/client/response.js +251 -0
  305. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  306. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  307. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  308. package/build/http-server/client/websocket-request.js +147 -0
  309. package/build/http-server/client/websocket-session.js +1755 -0
  310. package/build/http-server/cookie.js +245 -0
  311. package/build/http-server/development-reloader.js +240 -0
  312. package/build/http-server/index.js +561 -0
  313. package/build/http-server/remote-address.js +77 -0
  314. package/build/http-server/server-client.js +222 -0
  315. package/build/http-server/server-lock.js +178 -0
  316. package/build/http-server/websocket-channel-subscribers.js +110 -0
  317. package/build/http-server/websocket-channel.js +137 -0
  318. package/build/http-server/websocket-connection.js +118 -0
  319. package/build/http-server/websocket-event-log-store.js +433 -0
  320. package/build/http-server/websocket-events-host.js +170 -0
  321. package/build/http-server/websocket-events.js +50 -0
  322. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  323. package/build/http-server/worker-handler/in-process.js +155 -0
  324. package/build/http-server/worker-handler/index.js +370 -0
  325. package/build/http-server/worker-handler/worker-script.js +6 -0
  326. package/build/http-server/worker-handler/worker-thread.js +286 -0
  327. package/build/index.js +1 -2
  328. package/build/initializer.js +39 -0
  329. package/build/jobs/mail-delivery.js +22 -0
  330. package/build/logger/base-logger.js +34 -0
  331. package/build/logger/console-logger.js +28 -0
  332. package/build/logger/file-logger.js +36 -0
  333. package/build/logger/outputs/array-output.js +50 -0
  334. package/build/logger/outputs/console-output.js +32 -0
  335. package/build/logger/outputs/file-output.js +55 -0
  336. package/build/logger/outputs/stdout-output.js +64 -0
  337. package/build/logger.js +507 -0
  338. package/build/mailer/backends/smtp.js +197 -0
  339. package/build/mailer/base.js +337 -0
  340. package/build/mailer/delivery.js +70 -0
  341. package/build/mailer/index.js +24 -0
  342. package/build/mailer.js +15 -0
  343. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  344. package/build/plugins/sqljs-wasm-route.js +71 -0
  345. package/build/record-payload-values.js +83 -0
  346. package/build/routes/app-routes.js +17 -0
  347. package/build/routes/base-route.js +133 -0
  348. package/build/routes/basic-route.js +109 -0
  349. package/build/routes/built-in/debug/controller.js +12 -0
  350. package/build/routes/built-in/errors/controller.js +7 -0
  351. package/build/routes/get-route.js +75 -0
  352. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  353. package/build/routes/index.js +50 -0
  354. package/build/routes/namespace-route.js +51 -0
  355. package/build/routes/plugin-routes.js +141 -0
  356. package/build/routes/post-route.js +74 -0
  357. package/build/routes/resolver.js +535 -0
  358. package/build/routes/resource-route.js +154 -0
  359. package/build/routes/root-route.js +11 -0
  360. package/build/src/authorization/ability.d.ts +24 -23
  361. package/build/src/authorization/ability.d.ts.map +1 -1
  362. package/build/src/authorization/ability.js +14 -13
  363. package/build/src/authorization/base-resource.d.ts +20 -26
  364. package/build/src/authorization/base-resource.d.ts.map +1 -1
  365. package/build/src/authorization/base-resource.js +13 -11
  366. package/build/src/configuration-types.d.ts +21 -2
  367. package/build/src/configuration-types.d.ts.map +1 -1
  368. package/build/src/configuration-types.js +8 -2
  369. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  370. package/build/src/database/query/where-combinator.js +1 -2
  371. package/build/src/database/record/acts-as-list.js +2 -2
  372. package/build/src/database/record/attachments/store.d.ts +1 -1
  373. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  374. package/build/src/database/record/attachments/store.js +2 -2
  375. package/build/src/database/record/index.d.ts +82 -20
  376. package/build/src/database/record/index.d.ts.map +1 -1
  377. package/build/src/database/record/index.js +126 -13
  378. package/build/src/database/record/relationships/base.d.ts +2 -2
  379. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  380. package/build/src/database/record/relationships/base.js +3 -3
  381. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  382. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  383. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +59 -36
  384. package/build/src/frontend-model-controller.d.ts +6 -6
  385. package/build/src/frontend-model-controller.d.ts.map +1 -1
  386. package/build/src/frontend-model-controller.js +4 -4
  387. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  388. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  389. package/build/src/frontend-model-resource/base-resource.js +22 -10
  390. package/build/src/frontend-models/base.d.ts +19 -12
  391. package/build/src/frontend-models/base.d.ts.map +1 -1
  392. package/build/src/frontend-models/base.js +79 -48
  393. package/build/src/frontend-models/preloader.d.ts +6 -6
  394. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  395. package/build/src/frontend-models/preloader.js +5 -5
  396. package/build/src/frontend-models/query.d.ts.map +1 -1
  397. package/build/src/frontend-models/query.js +1 -4
  398. package/build/src/utils/ransack.d.ts.map +1 -1
  399. package/build/src/utils/ransack.js +1 -2
  400. package/build/templates/configuration.js +61 -0
  401. package/build/templates/generate-migration.js +11 -0
  402. package/build/templates/generate-model.js +6 -0
  403. package/build/templates/routes.js +11 -0
  404. package/build/testing/base-expect.js +17 -0
  405. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  406. package/build/testing/browser-test-app.js +32 -0
  407. package/build/testing/expect-to-change.js +55 -0
  408. package/build/testing/expect-utils.js +269 -0
  409. package/build/testing/expect.js +763 -0
  410. package/build/testing/request-client.js +90 -0
  411. package/build/testing/test-files-finder.js +364 -0
  412. package/build/testing/test-filter-parser.js +198 -0
  413. package/build/testing/test-runner.js +1168 -0
  414. package/build/testing/test-suite-splitter.js +177 -0
  415. package/build/testing/test.js +370 -0
  416. package/build/utils/backtrace-cleaner-node.js +87 -0
  417. package/build/utils/backtrace-cleaner.js +266 -0
  418. package/build/utils/ensure-error.js +15 -0
  419. package/build/utils/event-emitter.js +8 -0
  420. package/build/utils/file-exists.js +18 -0
  421. package/build/utils/format-value.js +101 -0
  422. package/build/utils/model-scope.js +56 -0
  423. package/build/utils/nest-callbacks.js +22 -0
  424. package/build/utils/plain-object.js +14 -0
  425. package/build/utils/ransack.js +859 -0
  426. package/build/utils/rest-args-error.js +14 -0
  427. package/build/utils/singularize-model-name.js +18 -0
  428. package/build/utils/split-sql-statements.js +88 -0
  429. package/build/utils/to-import-specifier.js +53 -0
  430. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  431. package/build/utils/with-tracked-stack.js +38 -0
  432. package/build/velocious-error.js +34 -0
  433. package/index.js +1 -0
  434. package/package.json +10 -4
  435. package/scripts/clean-build.js +8 -0
  436. package/scripts/ensure-bin-executable.js +13 -0
  437. package/scripts/run-tests.js +37 -0
  438. package/scripts/test-browser.js +486 -0
  439. package/src/application.js +229 -0
  440. package/src/authorization/ability.js +329 -0
  441. package/src/authorization/base-resource.js +143 -0
  442. package/src/background-jobs/client.js +50 -0
  443. package/src/background-jobs/cron-expression.js +277 -0
  444. package/src/background-jobs/forked-runner-child.js +86 -0
  445. package/src/background-jobs/job-record.js +13 -0
  446. package/src/background-jobs/job-registry.js +92 -0
  447. package/src/background-jobs/job-runner.js +107 -0
  448. package/src/background-jobs/job.js +77 -0
  449. package/src/background-jobs/json-socket.js +78 -0
  450. package/src/background-jobs/main.js +926 -0
  451. package/src/background-jobs/normalize-error.js +26 -0
  452. package/src/background-jobs/scheduler.js +274 -0
  453. package/src/background-jobs/socket-request.js +68 -0
  454. package/src/background-jobs/status-reporter.js +101 -0
  455. package/src/background-jobs/store.js +994 -0
  456. package/src/background-jobs/types.js +70 -0
  457. package/src/background-jobs/web/authorization.js +89 -0
  458. package/src/background-jobs/web/controller.js +280 -0
  459. package/src/background-jobs/web/index.js +57 -0
  460. package/src/background-jobs/web/path-matcher.js +74 -0
  461. package/src/background-jobs/web/registry.js +49 -0
  462. package/src/background-jobs/worker.js +683 -0
  463. package/src/beacon/client.js +330 -0
  464. package/src/beacon/in-process-broker.js +71 -0
  465. package/src/beacon/in-process-client.js +139 -0
  466. package/src/beacon/server.js +148 -0
  467. package/src/beacon/types.js +55 -0
  468. package/src/cli/base-command.js +67 -0
  469. package/src/cli/browser-cli.js +45 -0
  470. package/src/cli/commands/background-jobs-main.js +7 -0
  471. package/src/cli/commands/background-jobs-runner.js +7 -0
  472. package/src/cli/commands/background-jobs-worker.js +7 -0
  473. package/src/cli/commands/beacon.js +7 -0
  474. package/src/cli/commands/console.js +12 -0
  475. package/src/cli/commands/db/base-command.js +82 -0
  476. package/src/cli/commands/db/create.js +64 -0
  477. package/src/cli/commands/db/drop.js +75 -0
  478. package/src/cli/commands/db/migrate.js +17 -0
  479. package/src/cli/commands/db/reset.js +22 -0
  480. package/src/cli/commands/db/rollback.js +15 -0
  481. package/src/cli/commands/db/schema/dump.js +12 -0
  482. package/src/cli/commands/db/schema/load.js +12 -0
  483. package/src/cli/commands/db/seed.js +12 -0
  484. package/src/cli/commands/db/tenants/check.js +38 -0
  485. package/src/cli/commands/db/tenants/create.js +33 -0
  486. package/src/cli/commands/db/tenants/migrate.js +49 -0
  487. package/src/cli/commands/destroy/migration.js +7 -0
  488. package/src/cli/commands/generate/base-models.js +7 -0
  489. package/src/cli/commands/generate/frontend-models.js +12 -0
  490. package/src/cli/commands/generate/migration.js +7 -0
  491. package/src/cli/commands/generate/model.js +7 -0
  492. package/src/cli/commands/init.js +11 -0
  493. package/src/cli/commands/routes.js +7 -0
  494. package/src/cli/commands/run-script.js +12 -0
  495. package/src/cli/commands/runner.js +12 -0
  496. package/src/cli/commands/server.js +7 -0
  497. package/src/cli/commands/test.js +9 -0
  498. package/src/cli/index.js +152 -0
  499. package/src/cli/tenant-database-command-helper.js +198 -0
  500. package/src/cli/use-browser-cli.js +30 -0
  501. package/src/configuration-resolver.js +65 -0
  502. package/src/configuration-types.js +429 -0
  503. package/src/configuration.js +2590 -0
  504. package/src/controller.js +421 -0
  505. package/src/current-configuration.js +31 -0
  506. package/src/current.js +80 -0
  507. package/src/database/annotations-async-hooks.js +47 -0
  508. package/src/database/annotations.js +40 -0
  509. package/src/database/drivers/base-column.js +182 -0
  510. package/src/database/drivers/base-columns-index.js +81 -0
  511. package/src/database/drivers/base-foreign-key.js +104 -0
  512. package/src/database/drivers/base-table.js +156 -0
  513. package/src/database/drivers/base.js +1609 -0
  514. package/src/database/drivers/mssql/column.js +74 -0
  515. package/src/database/drivers/mssql/columns-index.js +6 -0
  516. package/src/database/drivers/mssql/connect-connection.js +16 -0
  517. package/src/database/drivers/mssql/foreign-key.js +12 -0
  518. package/src/database/drivers/mssql/index.js +590 -0
  519. package/src/database/drivers/mssql/options.js +79 -0
  520. package/src/database/drivers/mssql/query-parser.js +6 -0
  521. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  522. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  523. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  524. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  525. package/src/database/drivers/mssql/sql/delete.js +19 -0
  526. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  527. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  528. package/src/database/drivers/mssql/sql/insert.js +4 -0
  529. package/src/database/drivers/mssql/sql/update.js +31 -0
  530. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  531. package/src/database/drivers/mssql/structure-sql.js +120 -0
  532. package/src/database/drivers/mssql/table.js +145 -0
  533. package/src/database/drivers/mysql/column.js +112 -0
  534. package/src/database/drivers/mysql/columns-index.js +22 -0
  535. package/src/database/drivers/mysql/foreign-key.js +12 -0
  536. package/src/database/drivers/mysql/index.js +473 -0
  537. package/src/database/drivers/mysql/options.js +34 -0
  538. package/src/database/drivers/mysql/query-parser.js +6 -0
  539. package/src/database/drivers/mysql/query.js +37 -0
  540. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  541. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  542. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  543. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  544. package/src/database/drivers/mysql/sql/delete.js +21 -0
  545. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  546. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  547. package/src/database/drivers/mysql/sql/insert.js +6 -0
  548. package/src/database/drivers/mysql/sql/update.js +33 -0
  549. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  550. package/src/database/drivers/mysql/structure-sql.js +93 -0
  551. package/src/database/drivers/mysql/table.js +121 -0
  552. package/src/database/drivers/pgsql/column.js +90 -0
  553. package/src/database/drivers/pgsql/columns-index.js +6 -0
  554. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  555. package/src/database/drivers/pgsql/index.js +441 -0
  556. package/src/database/drivers/pgsql/options.js +32 -0
  557. package/src/database/drivers/pgsql/query-parser.js +6 -0
  558. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  559. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  560. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  561. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  562. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  563. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  564. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  565. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  566. package/src/database/drivers/pgsql/sql/update.js +33 -0
  567. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  568. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  569. package/src/database/drivers/pgsql/table.js +135 -0
  570. package/src/database/drivers/sqlite/base.js +509 -0
  571. package/src/database/drivers/sqlite/column.js +75 -0
  572. package/src/database/drivers/sqlite/columns-index.js +30 -0
  573. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  574. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  575. package/src/database/drivers/sqlite/index.js +394 -0
  576. package/src/database/drivers/sqlite/index.native.js +72 -0
  577. package/src/database/drivers/sqlite/index.web.js +99 -0
  578. package/src/database/drivers/sqlite/options.js +32 -0
  579. package/src/database/drivers/sqlite/query-parser.js +6 -0
  580. package/src/database/drivers/sqlite/query.js +35 -0
  581. package/src/database/drivers/sqlite/query.native.js +35 -0
  582. package/src/database/drivers/sqlite/query.web.js +49 -0
  583. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  584. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  585. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  586. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  587. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  588. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  589. package/src/database/drivers/sqlite/sql/update.js +33 -0
  590. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  591. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  592. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  593. package/src/database/drivers/sqlite/table.js +131 -0
  594. package/src/database/drivers/structure-sql/utils.js +35 -0
  595. package/src/database/handler.js +13 -0
  596. package/src/database/initializer-from-require-context.js +101 -0
  597. package/src/database/migration/index.js +438 -0
  598. package/src/database/migrator/files-finder.js +55 -0
  599. package/src/database/migrator/types.js +31 -0
  600. package/src/database/migrator.js +557 -0
  601. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  602. package/src/database/pool/base-methods-forward.js +52 -0
  603. package/src/database/pool/base.js +380 -0
  604. package/src/database/pool/single-multi-use.js +118 -0
  605. package/src/database/query/alter-table-base.js +104 -0
  606. package/src/database/query/base.js +49 -0
  607. package/src/database/query/create-database-base.js +42 -0
  608. package/src/database/query/create-index-base.js +117 -0
  609. package/src/database/query/create-table-base.js +205 -0
  610. package/src/database/query/delete-base.js +19 -0
  611. package/src/database/query/drop-database-base.js +38 -0
  612. package/src/database/query/drop-table-base.js +58 -0
  613. package/src/database/query/from-base.js +36 -0
  614. package/src/database/query/from-plain.js +16 -0
  615. package/src/database/query/from-table.js +18 -0
  616. package/src/database/query/index.js +533 -0
  617. package/src/database/query/insert-base.js +172 -0
  618. package/src/database/query/join-base.js +43 -0
  619. package/src/database/query/join-object.js +167 -0
  620. package/src/database/query/join-plain.js +18 -0
  621. package/src/database/query/join-tracker.js +93 -0
  622. package/src/database/query/model-class-query.js +1577 -0
  623. package/src/database/query/order-base.js +33 -0
  624. package/src/database/query/order-column.js +77 -0
  625. package/src/database/query/order-plain.js +28 -0
  626. package/src/database/query/preloader/belongs-to.js +267 -0
  627. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  628. package/src/database/query/preloader/has-many.js +316 -0
  629. package/src/database/query/preloader/has-one.js +123 -0
  630. package/src/database/query/preloader/selection.js +152 -0
  631. package/src/database/query/preloader.js +201 -0
  632. package/src/database/query/query-data.js +305 -0
  633. package/src/database/query/select-base.js +30 -0
  634. package/src/database/query/select-plain.js +18 -0
  635. package/src/database/query/select-table-and-column.js +28 -0
  636. package/src/database/query/update-base.js +41 -0
  637. package/src/database/query/upsert-base.js +103 -0
  638. package/src/database/query/where-base.js +38 -0
  639. package/src/database/query/where-combinator.js +31 -0
  640. package/src/database/query/where-hash.js +77 -0
  641. package/src/database/query/where-model-class-hash.js +505 -0
  642. package/src/database/query/where-not.js +23 -0
  643. package/src/database/query/where-plain.js +20 -0
  644. package/src/database/query/with-count.js +219 -0
  645. package/src/database/query-parser/base-query-parser.js +40 -0
  646. package/src/database/query-parser/from-parser.js +49 -0
  647. package/src/database/query-parser/group-parser.js +55 -0
  648. package/src/database/query-parser/joins-parser.js +37 -0
  649. package/src/database/query-parser/limit-parser.js +77 -0
  650. package/src/database/query-parser/options.js +94 -0
  651. package/src/database/query-parser/order-parser.js +45 -0
  652. package/src/database/query-parser/select-parser.js +67 -0
  653. package/src/database/query-parser/where-parser.js +46 -0
  654. package/src/database/record/acts-as-list.js +374 -0
  655. package/src/database/record/attachments/download.js +49 -0
  656. package/src/database/record/attachments/handle.js +188 -0
  657. package/src/database/record/attachments/normalize-input.js +213 -0
  658. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  659. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  660. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  661. package/src/database/record/attachments/store.js +591 -0
  662. package/src/database/record/index.js +4094 -0
  663. package/src/database/record/instance-relationships/base.js +289 -0
  664. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  665. package/src/database/record/instance-relationships/has-many.js +284 -0
  666. package/src/database/record/instance-relationships/has-one.js +117 -0
  667. package/src/database/record/record-not-found-error.js +3 -0
  668. package/src/database/record/relationships/base.js +195 -0
  669. package/src/database/record/relationships/belongs-to.js +57 -0
  670. package/src/database/record/relationships/has-many.js +46 -0
  671. package/src/database/record/relationships/has-one.js +46 -0
  672. package/src/database/record/state-machine.js +278 -0
  673. package/src/database/record/user-module.js +43 -0
  674. package/src/database/record/validators/base.js +27 -0
  675. package/src/database/record/validators/format.js +50 -0
  676. package/src/database/record/validators/presence.js +24 -0
  677. package/src/database/record/validators/uniqueness.js +124 -0
  678. package/src/database/table-data/index.js +241 -0
  679. package/src/database/table-data/table-column.js +416 -0
  680. package/src/database/table-data/table-foreign-key.js +69 -0
  681. package/src/database/table-data/table-index.js +46 -0
  682. package/src/database/table-data/table-reference.js +13 -0
  683. package/src/database/use-database.js +48 -0
  684. package/src/environment-handlers/base.js +561 -0
  685. package/src/environment-handlers/browser.js +338 -0
  686. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  687. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  688. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  689. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  690. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  691. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  692. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  693. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  694. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  695. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  696. package/src/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  697. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  698. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  699. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  700. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  701. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  702. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  703. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  704. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  705. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  706. package/src/environment-handlers/node.js +887 -0
  707. package/src/error-logger.js +30 -0
  708. package/src/frontend-model-controller.js +3491 -0
  709. package/src/frontend-model-resource/base-resource.js +935 -0
  710. package/src/frontend-models/base.js +4004 -0
  711. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  712. package/src/frontend-models/event-hook-models.js +49 -0
  713. package/src/frontend-models/model-registry.js +28 -0
  714. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  715. package/src/frontend-models/preloader.js +169 -0
  716. package/src/frontend-models/query.js +2245 -0
  717. package/src/frontend-models/resource-config-validation.js +56 -0
  718. package/src/frontend-models/resource-definition.js +399 -0
  719. package/src/frontend-models/transport-serialization.js +369 -0
  720. package/src/frontend-models/use-created-event.js +21 -0
  721. package/src/frontend-models/use-destroyed-event.js +148 -0
  722. package/src/frontend-models/use-model-class-event.js +164 -0
  723. package/src/frontend-models/use-updated-event.js +152 -0
  724. package/src/frontend-models/websocket-channel.js +494 -0
  725. package/src/frontend-models/websocket-publishers.js +224 -0
  726. package/src/http-client/header.js +17 -0
  727. package/src/http-client/index.js +139 -0
  728. package/src/http-client/request.js +94 -0
  729. package/src/http-client/response.js +151 -0
  730. package/src/http-client/websocket-client.js +27 -0
  731. package/src/http-server/client/index.js +507 -0
  732. package/src/http-server/client/params-to-object.js +152 -0
  733. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  734. package/src/http-server/client/request-buffer/header.js +19 -0
  735. package/src/http-server/client/request-buffer/index.js +535 -0
  736. package/src/http-server/client/request-parser.js +195 -0
  737. package/src/http-server/client/request-runner.js +321 -0
  738. package/src/http-server/client/request-timing.js +171 -0
  739. package/src/http-server/client/request.js +114 -0
  740. package/src/http-server/client/response.js +251 -0
  741. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  742. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  743. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  744. package/src/http-server/client/websocket-request.js +147 -0
  745. package/src/http-server/client/websocket-session.js +1755 -0
  746. package/src/http-server/cookie.js +245 -0
  747. package/src/http-server/development-reloader.js +240 -0
  748. package/src/http-server/index.js +561 -0
  749. package/src/http-server/remote-address.js +77 -0
  750. package/src/http-server/server-client.js +222 -0
  751. package/src/http-server/server-lock.js +178 -0
  752. package/src/http-server/websocket-channel-subscribers.js +110 -0
  753. package/src/http-server/websocket-channel.js +137 -0
  754. package/src/http-server/websocket-connection.js +118 -0
  755. package/src/http-server/websocket-event-log-store.js +433 -0
  756. package/src/http-server/websocket-events-host.js +170 -0
  757. package/src/http-server/websocket-events.js +50 -0
  758. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  759. package/src/http-server/worker-handler/in-process.js +155 -0
  760. package/src/http-server/worker-handler/index.js +370 -0
  761. package/src/http-server/worker-handler/worker-script.js +6 -0
  762. package/src/http-server/worker-handler/worker-thread.js +286 -0
  763. package/src/initializer.js +39 -0
  764. package/src/jobs/.gitkeep +1 -0
  765. package/src/jobs/mail-delivery.js +22 -0
  766. package/src/logger/base-logger.js +34 -0
  767. package/src/logger/console-logger.js +28 -0
  768. package/src/logger/file-logger.js +36 -0
  769. package/src/logger/outputs/array-output.js +50 -0
  770. package/src/logger/outputs/console-output.js +32 -0
  771. package/src/logger/outputs/file-output.js +55 -0
  772. package/src/logger/outputs/stdout-output.js +64 -0
  773. package/src/logger.js +507 -0
  774. package/src/mailer/backends/smtp.js +197 -0
  775. package/src/mailer/base.js +337 -0
  776. package/src/mailer/delivery.js +70 -0
  777. package/src/mailer/index.js +24 -0
  778. package/src/mailer.js +15 -0
  779. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  780. package/src/plugins/sqljs-wasm-route.js +71 -0
  781. package/src/record-payload-values.js +83 -0
  782. package/src/routes/app-routes.js +17 -0
  783. package/src/routes/base-route.js +133 -0
  784. package/src/routes/basic-route.js +109 -0
  785. package/src/routes/built-in/debug/controller.js +12 -0
  786. package/src/routes/built-in/errors/controller.js +7 -0
  787. package/src/routes/built-in/errors/not-found.ejs +1 -0
  788. package/src/routes/get-route.js +75 -0
  789. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  790. package/src/routes/index.js +50 -0
  791. package/src/routes/namespace-route.js +51 -0
  792. package/src/routes/plugin-routes.js +141 -0
  793. package/src/routes/post-route.js +74 -0
  794. package/src/routes/resolver.js +535 -0
  795. package/src/routes/resource-route.js +154 -0
  796. package/src/routes/root-route.js +11 -0
  797. package/src/templates/configuration.js +61 -0
  798. package/src/templates/generate-migration.js +11 -0
  799. package/src/templates/generate-model.js +6 -0
  800. package/src/templates/routes.js +11 -0
  801. package/src/testing/base-expect.js +17 -0
  802. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  803. package/src/testing/browser-test-app.js +32 -0
  804. package/src/testing/expect-to-change.js +55 -0
  805. package/src/testing/expect-utils.js +269 -0
  806. package/src/testing/expect.js +763 -0
  807. package/src/testing/request-client.js +90 -0
  808. package/src/testing/test-files-finder.js +364 -0
  809. package/src/testing/test-filter-parser.js +198 -0
  810. package/src/testing/test-runner.js +1168 -0
  811. package/src/testing/test-suite-splitter.js +177 -0
  812. package/src/testing/test.js +370 -0
  813. package/src/types/external-modules.d.ts +57 -0
  814. package/src/utils/backtrace-cleaner-node.js +87 -0
  815. package/src/utils/backtrace-cleaner.js +266 -0
  816. package/src/utils/ensure-error.js +15 -0
  817. package/src/utils/event-emitter.js +8 -0
  818. package/src/utils/file-exists.js +18 -0
  819. package/src/utils/format-value.js +101 -0
  820. package/src/utils/model-scope.js +56 -0
  821. package/src/utils/nest-callbacks.js +22 -0
  822. package/src/utils/plain-object.js +14 -0
  823. package/src/utils/ransack.js +859 -0
  824. package/src/utils/rest-args-error.js +14 -0
  825. package/src/utils/singularize-model-name.js +18 -0
  826. package/src/utils/split-sql-statements.js +88 -0
  827. package/src/utils/to-import-specifier.js +53 -0
  828. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  829. package/src/utils/with-tracked-stack.js +38 -0
  830. package/src/velocious-error.js +34 -0
  831. package/tsconfig.json +16 -0
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * RelationshipScopeCallback type.
3
- * @typedef {(query: import("../../query/model-class-query.js").default<?>) => (import("../../query/model-class-query.js").default<?> | void)} RelationshipScopeCallback
3
+ * @typedef {(query: import("../../query/model-class-query.js").default<typeof import("../index.js").default>) => (import("../../query/model-class-query.js").default<typeof import("../index.js").default> | void)} RelationshipScopeCallback
4
4
  */
5
5
  /**
6
6
  * RelationshipBaseArgsType type.
@@ -120,7 +120,7 @@ export default class VelociousDatabaseRecordBaseRelationship {
120
120
  /**
121
121
  * RelationshipScopeCallback type.
122
122
  */
123
- export type RelationshipScopeCallback = (query: import("../../query/model-class-query.js").default<unknown>) => (import("../../query/model-class-query.js").default<unknown> | void);
123
+ export type RelationshipScopeCallback = (query: import("../../query/model-class-query.js").default<typeof import("../index.js").default>) => (import("../../query/model-class-query.js").default<typeof import("../index.js").default> | void);
124
124
  /**
125
125
  * RelationshipBaseArgsType type.
126
126
  */
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/relationships/base.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;;;;;;;;;;;;;;;;;GAiBG;AAEH;IACE;;;OAGG;IACH,sLAFW,wBAAwB,EA0BlC;IAdC,mBAAmC;IACnC,8BAA0B;IAC1B,uBAA0C;IAC1C,+BAA2B;IAC3B,+BAA4B;IAC5B,+BAA2B;IAC3B,wDAAkB;IAClB,iDAA4B;IAC5B,kCAA+B;IAC/B,oBAA6B;IAC7B,yBAAwC;IACxC,8CAAmB;IACnB,4BAAsB;IACtB,aAAgB;IAGlB;;;OAGG;IACH,eAFa,OAAO,CAEmB;IAEvC,gEAAiE;IAEjE;;;OAGG;IACH,mBAFa,OAAO,CAE2B;IAE/C;;;OAGG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEU;IAEzC;;;;OAIG;IACH,iBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,gBAFa,MAAM,GAAG,SAAS,CAI9B;IAED;;;OAGG;IACH,iBAFa,cAAc,aAAa,EAAE,OAAO,CAEP;IAE1C;;;OAGG;IACH,uBAFa,MAAM,CAEmC;IAEtD;;;OAGG;IACH,YAFa,yBAAyB,GAAG,SAAS,CAEjB;IAEjC;;;;;OAKG;IACH,WAJa,CAAC,SACH,CAAC,GACC,CAAC,CAcb;IAED;;;OAGG;IACH,kBAFa,OAAO,CAInB;IAED;;;OAGG;IACH,4BAFa,MAAM,CAoBlB;IATK,2CAAiE;IAWvE;;;OAGG;IACH,iBAFa,MAAM,CAEwB;IAE3C;;;OAGG;IACH,WAFa,MAAM,CAEW;IAE9B;;;OAGG;IACH,uBAFa,cAAc,aAAa,EAAE,OAAO,GAAG,SAAS,CAY5D;CACF;;;;wCA3LY,CAAC,KAAK,EAAE,OAAO,kCAAkC,EAAE,OAAO,CAAC,OAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,EAAE,OAAO,CAAC,OAAC,CAAC,GAAG,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;iBAS/H,MAAM,GAAG,SAAS;;;;;;;;;;;;gBAGlB,cAAc,aAAa,EAAE,OAAO;;;;;;;;;;;;sBAGpC,MAAM;;;;;;;;;;;;UAGN,MAAM"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../src/database/record/relationships/base.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;;;;;;;;;;;;;;;;;GAiBG;AAEH;IACE;;;OAGG;IACH,sLAFW,wBAAwB,EA0BlC;IAdC,mBAAmC;IACnC,8BAA0B;IAC1B,uBAA0C;IAC1C,+BAA2B;IAC3B,+BAA4B;IAC5B,+BAA2B;IAC3B,wDAAkB;IAClB,iDAA4B;IAC5B,kCAA+B;IAC/B,oBAA6B;IAC7B,yBAAwC;IACxC,8CAAmB;IACnB,4BAAsB;IACtB,aAAgB;IAGlB;;;OAGG;IACH,eAFa,OAAO,CAEmB;IAEvC,gEAAiE;IAEjE;;;OAGG;IACH,mBAFa,OAAO,CAE2B;IAE/C;;;OAGG;IACH,gBAFa,MAAM,GAAG,SAAS,CAEU;IAEzC;;;;OAIG;IACH,iBAFa,MAAM,CAIlB;IAED;;;;OAIG;IACH,gBAFa,MAAM,GAAG,SAAS,CAI9B;IAED;;;OAGG;IACH,iBAFa,cAAc,aAAa,EAAE,OAAO,CAEP;IAE1C;;;OAGG;IACH,uBAFa,MAAM,CAEmC;IAEtD;;;OAGG;IACH,YAFa,yBAAyB,GAAG,SAAS,CAEjB;IAEjC;;;;;OAKG;IACH,WAJa,CAAC,SACH,CAAC,GACC,CAAC,CAcb;IAED;;;OAGG;IACH,kBAFa,OAAO,CAInB;IAED;;;OAGG;IACH,4BAFa,MAAM,CAoBlB;IATK,2CAAiE;IAWvE;;;OAGG;IACH,iBAFa,MAAM,CAEwB;IAE3C;;;OAGG;IACH,WAFa,MAAM,CAEW;IAE9B;;;OAGG;IACH,uBAFa,cAAc,aAAa,EAAE,OAAO,GAAG,SAAS,CAY5D;CACF;;;;wCA3LY,CAAC,KAAK,EAAE,OAAO,kCAAkC,EAAE,OAAO,CAAC,cAAc,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,kCAAkC,EAAE,OAAO,CAAC,cAAc,aAAa,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;iBASrM,MAAM,GAAG,SAAS;;;;;;;;;;;;gBAGlB,cAAc,aAAa,EAAE,OAAO;;;;;;;;;;;;sBAGpC,MAAM;;;;;;;;;;;;UAGN,MAAM"}
@@ -3,7 +3,7 @@ import restArgsError from "../../../utils/rest-args-error.js";
3
3
  import * as inflection from "inflection";
4
4
  /**
5
5
  * RelationshipScopeCallback type.
6
- * @typedef {(query: import("../../query/model-class-query.js").default<?>) => (import("../../query/model-class-query.js").default<?> | void)} RelationshipScopeCallback
6
+ * @typedef {(query: import("../../query/model-class-query.js").default<typeof import("../index.js").default>) => (import("../../query/model-class-query.js").default<typeof import("../index.js").default> | void)} RelationshipScopeCallback
7
7
  */
8
8
  /**
9
9
  * RelationshipBaseArgsType type.
@@ -113,7 +113,7 @@ export default class VelociousDatabaseRecordBaseRelationship {
113
113
  * Narrows the runtime value to the documented type.
114
114
  @type {T | void} */ (scope.call(query, /**
115
115
  * Narrows the runtime value to the documented type.
116
- @type {import("../../query/model-class-query.js").default<?>} */ (query)));
116
+ @type {import("../../query/model-class-query.js").default<typeof import("../index.js").default>} */ (query)));
117
117
  return scopedQuery || query;
118
118
  }
119
119
  /**
@@ -170,4 +170,4 @@ export default class VelociousDatabaseRecordBaseRelationship {
170
170
  throw new Error("Couldn't figure out the target model class");
171
171
  }
172
172
  }
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvcmVsYXRpb25zaGlwcy9iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGFBQWEsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4Qzs7O0dBR0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVDQUF1QztJQUMxRDs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQztRQUN2TCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7UUFDckYsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUVoSixJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQ3JELENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUE7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFD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QUFBO1lBQ25FLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7Z0JBRXpFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLGVBQWUsT0FBTyxDQUFBO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUE7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUEsQ0FBQyxDQUFDO0lBRTNDOzs7T0FHRztJQUNILE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDO0lBRTlCOzs7T0FHRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3RELE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDOUQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUNuQixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG4vKipcbiAqIFJlbGF0aW9uc2hpcFNjb3BlQ2FsbGJhY2sgdHlwZS5cbiAqIEB0eXBlZGVmIHsocXVlcnk6IGltcG9ydChcIi4uLy4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8Pz4pID0+IChpbXBvcnQoXCIuLi8uLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+IHwgdm9pZCl9IFJlbGF0aW9uc2hpcFNjb3BlQ2FsbGJhY2tcbiAqL1xuLyoqXG4gKiBSZWxhdGlvbnNoaXBCYXNlQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlbGF0aW9uc2hpcEJhc2VBcmdzVHlwZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b2xvYWRdIC0gV2hldGhlciB0byBhdXRvLWJhdGNoLXByZWxvYWQgc2libGluZ3Mgd2hlbiB0aGlzIHJlbGF0aW9uc2hpcCBpcyBsYXp5LWxvYWRlZC4gRGVmYXVsdCB0cnVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdIC0gTmFtZSBvZiB0aGUgcmVsYXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvdW50ZXJDYWNoZV0gLSBBdXRvLXN5bmMgcGFyZW50IGNvdW50IGNvbHVtbiBvbiBjcmVhdGUvdXBkYXRlL2Rlc3Ryb3kuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RlcGVuZGVudF0gLSBEZXBlbmRlbnQgYWN0aW9uIHdoZW4gcGFyZW50IGlzIGRlc3Ryb3llZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbZm9yZWlnbktleV0gLSBFeHBsaWNpdCBmb3JlaWduIGtleSBjb2x1bW4gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW52ZXJzZU9mXSAtIEludmVyc2UgcmVsYXRpb25zaGlwIG5hbWUgb24gdGhlIHJlbGF0ZWQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBba2xhc3NdIC0gUmVsYXRlZCBtb2RlbCBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBPd25pbmcgbW9kZWwgY2xhc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByaW1hcnlLZXldIC0gUHJpbWFyeSBrZXkgY29sdW1uIG9uIHRoZSBvd25pbmcgbW9kZWwuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2x5bW9ycGhpY10gLSBXaGV0aGVyIHRoZSByZWxhdGlvbnNoaXAgaXMgcG9seW1vcnBoaWMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIE5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCBvbiB0aGUgbW9kZWwuXG4gKiBAcHJvcGVydHkge1JlbGF0aW9uc2hpcFNjb3BlQ2FsbGJhY2t9IFtzY29wZV0gLSBPcHRpb25hbCBzY29wZSBjYWxsYmFjayBmb3IgdGhlIHJlbGF0aW9uc2hpcC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyb3VnaF0gLSBOYW1lIG9mIHRoZSB0aHJvdWdoIGFzc29jaWF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZSAoZS5nLiBcImhhc01hbnlcIikuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VSZWNvcmRCYXNlUmVsYXRpb25zaGlwIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7UmVsYXRpb25zaGlwQmFzZUFyZ3NUeXBlfSBhcmdzIC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb24gYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F1dG9sb2FkLCBjbGFzc05hbWUsIGNvdW50ZXJDYWNoZSwgZGVwZW5kZW50LCBmb3JlaWduS2V5LCBpbnZlcnNlT2YsIGtsYXNzLCBtb2RlbENsYXNzLCBwcmltYXJ5S2V5ID0gXCJpZFwiLCBwb2x5bW9ycGhpYywgcmVsYXRpb25zaGlwTmFtZSwgc2NvcGUsIHRocm91Z2gsIHR5cGUsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgJ21vZGVsQ2xhc3MnIHdhc24ndCBnaXZlbiBmb3IgJHtyZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgaWYgKCFjbGFzc05hbWUgJiYgIWtsYXNzICYmICFwb2x5bW9ycGhpYykgdGhyb3cgbmV3IEVycm9yKGBOZWl0aGVyICdjbGFzc05hbWUnIG9yICdrbGFzcycgd2FzIGdpdmVuIGZvciAke21vZGVsQ2xhc3MubmFtZX0jJHtyZWxhdGlvbnNoaXBOYW1lfWApXG5cbiAgICBpZiAoY2xhc3NOYW1lID09IFwiRXZlbnRTZXJ5XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtb2RlbCBuYW1lOiAke2NsYXNzTmFtZX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2F1dG9sb2FkID0gYXV0b2xvYWQgIT09IGZhbHNlXG4gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcbiAgICB0aGlzLl9jb3VudGVyQ2FjaGUgPSBjb3VudGVyQ2FjaGUgfHwgZmFsc2VcbiAgICB0aGlzLl9kZXBlbmRlbnQgPSBkZXBlbmRlbnRcbiAgICB0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5XG4gICAgdGhpcy5faW52ZXJzZU9mID0gaW52ZXJzZU9mXG4gICAgdGhpcy5rbGFzcyA9IGtsYXNzXG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMuX3BvbHltb3JwaGljID0gcG9seW1vcnBoaWNcbiAgICB0aGlzLl9wcmltYXJ5S2V5ID0gcHJpbWFyeUtleVxuICAgIHRoaXMucmVsYXRpb25zaGlwTmFtZSA9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICB0aGlzLl9zY29wZSA9IHNjb3BlXG4gICAgdGhpcy50aHJvdWdoID0gdGhyb3VnaFxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBhdXRvbG9hZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyByZWxhdGlvbnNoaXAgYXV0by1iYXRjaC1wcmVsb2FkcyBzaWJsaW5ncyBvbiBsYXp5IGFjY2Vzcy5cbiAgICovXG4gIGdldEF1dG9sb2FkKCkgeyByZXR1cm4gdGhpcy5fYXV0b2xvYWQgfVxuXG4gIGdldENvbmZpZ3VyYXRpb24oKSB7IHJldHVybiB0aGlzLm1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGNvdW50ZXIgY2FjaGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGEgY291bnRlciBjYWNoZSBjb2x1bW4gaXMgc3luY2VkIG9uIHRoZSBwYXJlbnQuXG4gICAqL1xuICBnZXRDb3VudGVyQ2FjaGUoKSB7IHJldHVybiB0aGlzLl9jb3VudGVyQ2FjaGUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkZXBlbmRlbnQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFdoYXQgd2lsbCBiZSBkb25lIHdoZW4gdGhlIHBhcmVudCByZWNvcmQgaXMgZGVzdHJveWVkLiBFLmcuIFwiZGVzdHJveVwiLCBcIm51bGxpZnlcIiwgXCJyZXN0cmljdFwiIGV0Yy5cbiAgICovXG4gIGdldERlcGVuZGVudCgpIHsgcmV0dXJuIHRoaXMuX2RlcGVuZGVudCB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGZvcmVpZ24ga2V5LlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGZvcmVpZ24ga2V5LCBlLmcuIFwidXNlcl9pZFwiLCBcInBvc3RfaWRcIiBldGMuXG4gICAqL1xuICBnZXRGb3JlaWduS2V5KCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImdldEZvcmVpZ25LZXkgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgaW52ZXJzZSBvZi5cbiAgICogQGFic3RyYWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBuYW1lIG9mIHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgZS5nLiBcInBvc3RzXCIsIFwiY29tbWVudHNcIiBldGMuXG4gICAqL1xuICBnZXRJbnZlcnNlT2YoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0SW52ZXJzZU9mIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9IC0gVGhlIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZ2V0TW9kZWxDbGFzcygpIHsgcmV0dXJuIHRoaXMubW9kZWxDbGFzcyB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLCBlLmcuIFwicG9zdHNcIiwgXCJ1c2VyXCIsIFwiY29tbWVudHNcIiBldGMuXG4gICAqL1xuICBnZXRSZWxhdGlvbnNoaXBOYW1lKCkgeyByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBOYW1lIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc2NvcGUuXG4gICAqIEByZXR1cm5zIHtSZWxhdGlvbnNoaXBTY29wZUNhbGxiYWNrIHwgdW5kZWZpbmVkfSAtIFRoZSBzY29wZSBjYWxsYmFjay5cbiAgICovXG4gIGdldFNjb3BlKCkgeyByZXR1cm4gdGhpcy5fc2NvcGUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFwcGx5IHNjb3BlLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1R9IHF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtUfSAtIFNjb3BlZCBxdWVyeS5cbiAgICovXG4gIGFwcGx5U2NvcGUocXVlcnkpIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKVxuXG4gICAgaWYgKCFzY29wZSkgcmV0dXJuIHF1ZXJ5XG5cbiAgICBjb25zdCBzY29wZWRRdWVyeSA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7VCB8IHZvaWR9ICovIChzY29wZS5jYWxsKHF1ZXJ5LCAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PD8+fSAqLyAocXVlcnkpKSlcblxuICAgIHJldHVybiBzY29wZWRRdWVyeSB8fCBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHBvbHltb3JwaGljLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHBvbHltb3JwaGljLlxuICAgKi9cbiAgZ2V0UG9seW1vcnBoaWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvbHltb3JwaGljIHx8IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcG9seW1vcnBoaWMgdHlwZSBjb2x1bW4uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBvbHltb3JwaGljIHR5cGUgY29sdW1uLlxuICAgKi9cbiAgZ2V0UG9seW1vcnBoaWNUeXBlQ29sdW1uKCkge1xuICAgIGlmICghdGhpcy5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbENsYXNzLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfSBpc24ndCBwb2x5bW9ycGhpY2ApXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW4pIHtcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXkgPSB0aGlzLmdldEZvcmVpZ25LZXkoKVxuXG4gICAgICBpZiAoZm9yZWlnbktleSAmJiBmb3JlaWduS2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICAgIHRoaXMuX3BvbHltb3JwaGljVHlwZUNvbHVtbiA9IGZvcmVpZ25LZXkucmVwbGFjZSgvX2lkJC8sIFwiX3R5cGVcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVuZGVyc2NvcmVkTmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLmdldFJlbGF0aW9uc2hpcE5hbWUoKSlcblxuICAgICAgICB0aGlzLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW4gPSBgJHt1bmRlcnNjb3JlZE5hbWV9X3R5cGVgXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3BvbHltb3JwaGljVHlwZUNvbHVtblxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZm9yZWlnbiBrZXksIGUuZy4gXCJpZFwiIGV0Yy5cbiAgICovXG4gIGdldFByaW1hcnlLZXkoKSB7IHJldHVybiB0aGlzLl9wcmltYXJ5S2V5IH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdHlwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHR5cGUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgZS5nLiBcImhhc19tYW55XCIsIFwiYmVsb25nc190b1wiLCBcImhhc19vbmVcIiwgXCJoYXNfYW5kX2JlbG9uZ3NfdG9fbWFueVwiIGV0Yy5cbiAgICovXG4gIGdldFR5cGUoKSB7IHJldHVybiB0aGlzLnR5cGUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0YXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gVGhlIHRhcmdldCBtb2RlbCBjbGFzcyBmb3IgdGhpcyByZWxhdGlvbnNoaXAsIGUuZy4gaWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBcInBvc3RzXCIgdGhlbiB0aGUgdGFyZ2V0IG1vZGVsIGNsYXNzIGlzIHRoZSBQb3N0IGNsYXNzLlxuICAgKi9cbiAgZ2V0VGFyZ2V0TW9kZWxDbGFzcygpIHtcbiAgICBpZiAodGhpcy5nZXRQb2x5bW9ycGhpYygpICYmIHRoaXMudHlwZSA9PSBcImJlbG9uZ3NUb1wiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmICh0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3ModGhpcy5jbGFzc05hbWUpXG4gICAgfSBlbHNlIGlmICh0aGlzLmtsYXNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5rbGFzc1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpZ3VyZSBvdXQgdGhlIHRhcmdldCBtb2RlbCBjbGFzc1wiKVxuICB9XG59XG4iXX0=
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvcmVsYXRpb25zaGlwcy9iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGFBQWEsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4Qzs7O0dBR0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLENBQUMsT0FBTyxPQUFPLHVDQUF1QztJQUMxRDs7O09BR0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQztRQUN2TCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7UUFDckYsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxVQUFVLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUVoSixJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQ3JELENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUE7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFD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QUFBO1lBQ25FLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7Z0JBRXpFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLGVBQWUsT0FBTyxDQUFBO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUE7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUEsQ0FBQyxDQUFDO0lBRTNDOzs7T0FHRztJQUNILE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUEsQ0FBQyxDQUFDO0lBRTlCOzs7T0FHRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3RELE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDOUQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUNuQixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG4vKipcbiAqIFJlbGF0aW9uc2hpcFNjb3BlQ2FsbGJhY2sgdHlwZS5cbiAqIEB0eXBlZGVmIHsocXVlcnk6IGltcG9ydChcIi4uLy4uL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHQ+KSA9PiAoaW1wb3J0KFwiLi4vLi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi4vaW5kZXguanNcIikuZGVmYXVsdD4gfCB2b2lkKX0gUmVsYXRpb25zaGlwU2NvcGVDYWxsYmFja1xuICovXG4vKipcbiAqIFJlbGF0aW9uc2hpcEJhc2VBcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUmVsYXRpb25zaGlwQmFzZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvbG9hZF0gLSBXaGV0aGVyIHRvIGF1dG8tYmF0Y2gtcHJlbG9hZCBzaWJsaW5ncyB3aGVuIHRoaXMgcmVsYXRpb25zaGlwIGlzIGxhenktbG9hZGVkLiBEZWZhdWx0IHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV0gLSBOYW1lIG9mIHRoZSByZWxhdGVkIG1vZGVsIGNsYXNzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbY291bnRlckNhY2hlXSAtIEF1dG8tc3luYyBwYXJlbnQgY291bnQgY29sdW1uIG9uIGNyZWF0ZS91cGRhdGUvZGVzdHJveS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVwZW5kZW50XSAtIERlcGVuZGVudCBhY3Rpb24gd2hlbiBwYXJlbnQgaXMgZGVzdHJveWVkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtmb3JlaWduS2V5XSAtIEV4cGxpY2l0IGZvcmVpZ24ga2V5IGNvbHVtbiBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbnZlcnNlT2ZdIC0gSW52ZXJzZSByZWxhdGlvbnNoaXAgbmFtZSBvbiB0aGUgcmVsYXRlZCBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtrbGFzc10gLSBSZWxhdGVkIG1vZGVsIGNsYXNzLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi4vaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE93bmluZyBtb2RlbCBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUtleV0gLSBQcmltYXJ5IGtleSBjb2x1bW4gb24gdGhlIG93bmluZyBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbHltb3JwaGljXSAtIFdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCBpcyBwb2x5bW9ycGhpYy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gTmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIG9uIHRoZSBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRpb25zaGlwU2NvcGVDYWxsYmFja30gW3Njb3BlXSAtIE9wdGlvbmFsIHNjb3BlIGNhbGxiYWNrIGZvciB0aGUgcmVsYXRpb25zaGlwLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJvdWdoXSAtIE5hbWUgb2YgdGhlIHRocm91Z2ggYXNzb2NpYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSAtIFJlbGF0aW9uc2hpcCB0eXBlIChlLmcuIFwiaGFzTWFueVwiKS5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZVJlY29yZEJhc2VSZWxhdGlvbnNoaXAge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtSZWxhdGlvbnNoaXBCYXNlQXJnc1R5cGV9IGFyZ3MgLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbiBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXV0b2xvYWQsIGNsYXNzTmFtZSwgY291bnRlckNhY2hlLCBkZXBlbmRlbnQsIGZvcmVpZ25LZXksIGludmVyc2VPZiwga2xhc3MsIG1vZGVsQ2xhc3MsIHByaW1hcnlLZXkgPSBcImlkXCIsIHBvbHltb3JwaGljLCByZWxhdGlvbnNoaXBOYW1lLCBzY29wZSwgdGhyb3VnaCwgdHlwZSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGlmICghbW9kZWxDbGFzcykgdGhyb3cgbmV3IEVycm9yKGAnbW9kZWxDbGFzcycgd2Fzbid0IGdpdmVuIGZvciAke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiAha2xhc3MgJiYgIXBvbHltb3JwaGljKSB0aHJvdyBuZXcgRXJyb3IoYE5laXRoZXIgJ2NsYXNzTmFtZScgb3IgJ2tsYXNzJyB3YXMgZ2l2ZW4gZm9yICR7bW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcblxuICAgIGlmIChjbGFzc05hbWUgPT0gXCJFdmVudFNlcnlcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1vZGVsIG5hbWU6ICR7Y2xhc3NOYW1lfWApXG4gICAgfVxuXG4gICAgdGhpcy5fYXV0b2xvYWQgPSBhdXRvbG9hZCAhPT0gZmFsc2VcbiAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxuICAgIHRoaXMuX2NvdW50ZXJDYWNoZSA9IGNvdW50ZXJDYWNoZSB8fCBmYWxzZVxuICAgIHRoaXMuX2RlcGVuZGVudCA9IGRlcGVuZGVudFxuICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXlcbiAgICB0aGlzLl9pbnZlcnNlT2YgPSBpbnZlcnNlT2ZcbiAgICB0aGlzLmtsYXNzID0ga2xhc3NcbiAgICB0aGlzLm1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gICAgdGhpcy5fcG9seW1vcnBoaWMgPSBwb2x5bW9ycGhpY1xuICAgIHRoaXMuX3ByaW1hcnlLZXkgPSBwcmltYXJ5S2V5XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBOYW1lID0gcmVsYXRpb25zaGlwTmFtZVxuICAgIHRoaXMuX3Njb3BlID0gc2NvcGVcbiAgICB0aGlzLnRocm91Z2ggPSB0aHJvdWdoXG4gICAgdGhpcy50eXBlID0gdHlwZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGF1dG9sb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHJlbGF0aW9uc2hpcCBhdXRvLWJhdGNoLXByZWxvYWRzIHNpYmxpbmdzIG9uIGxhenkgYWNjZXNzLlxuICAgKi9cbiAgZ2V0QXV0b2xvYWQoKSB7IHJldHVybiB0aGlzLl9hdXRvbG9hZCB9XG5cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHsgcmV0dXJuIHRoaXMubW9kZWxDbGFzcy5fZ2V0Q29uZmlndXJhdGlvbigpIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY291bnRlciBjYWNoZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYSBjb3VudGVyIGNhY2hlIGNvbHVtbiBpcyBzeW5jZWQgb24gdGhlIHBhcmVudC5cbiAgICovXG4gIGdldENvdW50ZXJDYWNoZSgpIHsgcmV0dXJuIHRoaXMuX2NvdW50ZXJDYWNoZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRlcGVuZGVudC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gV2hhdCB3aWxsIGJlIGRvbmUgd2hlbiB0aGUgcGFyZW50IHJlY29yZCBpcyBkZXN0cm95ZWQuIEUuZy4gXCJkZXN0cm95XCIsIFwibnVsbGlmeVwiLCBcInJlc3RyaWN0XCIgZXRjLlxuICAgKi9cbiAgZ2V0RGVwZW5kZW50KCkgeyByZXR1cm4gdGhpcy5fZGVwZW5kZW50IH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZm9yZWlnbiBrZXkuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZm9yZWlnbiBrZXksIGUuZy4gXCJ1c2VyX2lkXCIsIFwicG9zdF9pZFwiIGV0Yy5cbiAgICovXG4gIGdldEZvcmVpZ25LZXkoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0Rm9yZWlnbktleSBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBpbnZlcnNlIG9mLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5hbWUgb2YgdGhlIGludmVyc2UgcmVsYXRpb25zaGlwLCBlLmcuIFwicG9zdHNcIiwgXCJjb21tZW50c1wiIGV0Yy5cbiAgICovXG4gIGdldEludmVyc2VPZigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZXRJbnZlcnNlT2Ygbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi4vaW5kZXguanNcIikuZGVmYXVsdH0gLSBUaGUgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBnZXRNb2RlbENsYXNzKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGUuZy4gXCJwb3N0c1wiLCBcInVzZXJcIiwgXCJjb21tZW50c1wiIGV0Yy5cbiAgICovXG4gIGdldFJlbGF0aW9uc2hpcE5hbWUoKSB7IHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE5hbWUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBzY29wZS5cbiAgICogQHJldHVybnMge1JlbGF0aW9uc2hpcFNjb3BlQ2FsbGJhY2sgfCB1bmRlZmluZWR9IC0gVGhlIHNjb3BlIGNhbGxiYWNrLlxuICAgKi9cbiAgZ2V0U2NvcGUoKSB7IHJldHVybiB0aGlzLl9zY29wZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgc2NvcGUuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VH0gcXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1R9IC0gU2NvcGVkIHF1ZXJ5LlxuICAgKi9cbiAgYXBwbHlTY29wZShxdWVyeSkge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpXG5cbiAgICBpZiAoIXNjb3BlKSByZXR1cm4gcXVlcnlcblxuICAgIGNvbnN0IHNjb3BlZFF1ZXJ5ID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtUIHwgdm9pZH0gKi8gKHNjb3BlLmNhbGwocXVlcnksIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi8gKHF1ZXJ5KSkpXG5cbiAgICByZXR1cm4gc2NvcGVkUXVlcnkgfHwgcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBwb2x5bW9ycGhpYy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBwb2x5bW9ycGhpYy5cbiAgICovXG4gIGdldFBvbHltb3JwaGljKCkge1xuICAgIHJldHVybiB0aGlzLl9wb2x5bW9ycGhpYyB8fCBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHBvbHltb3JwaGljIHR5cGUgY29sdW1uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwb2x5bW9ycGhpYyB0eXBlIGNvbHVtbi5cbiAgICovXG4gIGdldFBvbHltb3JwaGljVHlwZUNvbHVtbigpIHtcbiAgICBpZiAoIXRoaXMuZ2V0UG9seW1vcnBoaWMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWxDbGFzcy5uYW1lfSMke3RoaXMucmVsYXRpb25zaGlwTmFtZX0gaXNuJ3QgcG9seW1vcnBoaWNgKVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fcG9seW1vcnBoaWNUeXBlQ29sdW1uKSB7XG4gICAgICBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5nZXRGb3JlaWduS2V5KClcblxuICAgICAgaWYgKGZvcmVpZ25LZXkgJiYgZm9yZWlnbktleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgICB0aGlzLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW4gPSBmb3JlaWduS2V5LnJlcGxhY2UoL19pZCQvLCBcIl90eXBlXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1bmRlcnNjb3JlZE5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpXG5cbiAgICAgICAgdGhpcy5fcG9seW1vcnBoaWNUeXBlQ29sdW1uID0gYCR7dW5kZXJzY29yZWROYW1lfV90eXBlYFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wb2x5bW9ycGhpY1R5cGVDb2x1bW5cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBwcmltYXJ5IGtleS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGZvcmVpZ24ga2V5LCBlLmcuIFwiaWRcIiBldGMuXG4gICAqL1xuICBnZXRQcmltYXJ5S2V5KCkgeyByZXR1cm4gdGhpcy5fcHJpbWFyeUtleSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB0eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAsIGUuZy4gXCJoYXNfbWFueVwiLCBcImJlbG9uZ3NfdG9cIiwgXCJoYXNfb25lXCIsIFwiaGFzX2FuZF9iZWxvbmdzX3RvX21hbnlcIiBldGMuXG4gICAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gdGhpcy50eXBlIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IFRoZSB0YXJnZXQgbW9kZWwgY2xhc3MgZm9yIHRoaXMgcmVsYXRpb25zaGlwLCBlLmcuIGlmIHRoZSByZWxhdGlvbnNoaXAgaXMgXCJwb3N0c1wiIHRoZW4gdGhlIHRhcmdldCBtb2RlbCBjbGFzcyBpcyB0aGUgUG9zdCBjbGFzcy5cbiAgICovXG4gIGdldFRhcmdldE1vZGVsQ2xhc3MoKSB7XG4gICAgaWYgKHRoaXMuZ2V0UG9seW1vcnBoaWMoKSAmJiB0aGlzLnR5cGUgPT0gXCJiZWxvbmdzVG9cIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAodGhpcy5jbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKHRoaXMuY2xhc3NOYW1lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5rbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMua2xhc3NcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaWd1cmUgb3V0IHRoZSB0YXJnZXQgbW9kZWwgY2xhc3NcIilcbiAgfVxufVxuIl19
@@ -3,15 +3,17 @@ export default class DbGenerateModel extends BaseCommand {
3
3
  /**
4
4
  * Runs js doc type from column.
5
5
  * @param {import("../../../../../database/drivers/base-column.js").default} column - Column.
6
+ * @param {typeof import("../../../../../database/record/index.js").default} modelClass - Model class owning the column (for declared attribute casts).
6
7
  * @returns {string | undefined} - The js doc type from column.
7
8
  */
8
- jsDocTypeFromColumn(column: import("../../../../../database/drivers/base-column.js").default): string | undefined;
9
+ jsDocTypeFromColumn(column: import("../../../../../database/drivers/base-column.js").default, modelClass: typeof import("../../../../../database/record/index.js").default): string | undefined;
9
10
  /**
10
11
  * Runs js doc setter type from column.
11
12
  * @param {import("../../../../../database/drivers/base-column.js").default} column - Column.
13
+ * @param {typeof import("../../../../../database/record/index.js").default} modelClass - Model class owning the column (for declared attribute casts).
12
14
  * @returns {string | undefined} - The js doc setter type from column.
13
15
  */
14
- jsDocSetterTypeFromColumn(column: import("../../../../../database/drivers/base-column.js").default): string | undefined;
16
+ jsDocSetterTypeFromColumn(column: import("../../../../../database/drivers/base-column.js").default, modelClass: typeof import("../../../../../database/record/index.js").default): string | undefined;
15
17
  }
16
18
  import BaseCommand from "../../../../../cli/base-command.js";
17
19
  //# sourceMappingURL=base-models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-models.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/base-models.js"],"names":[],"mappings":"AAKA;IACE,yBA4TC;IAED;;;;OAIG;IACH,4BAHW,OAAO,gDAAgD,EAAE,OAAO,GAC9D,MAAM,GAAG,SAAS,CAkB9B;IAED;;;;OAIG;IACH,kCAHW,OAAO,gDAAgD,EAAE,OAAO,GAC9D,MAAM,GAAG,SAAS,CAU9B;CACF;wBAzWuB,oCAAoC"}
1
+ {"version":3,"file":"base-models.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/base-models.js"],"names":[],"mappings":"AAqCA;IACE,yBAiUC;IAED;;;;;OAKG;IACH,4BAJW,OAAO,gDAAgD,EAAE,OAAO,cAChE,cAAc,yCAAyC,EAAE,OAAO,GAC9D,MAAM,GAAG,SAAS,CAa9B;IAED;;;;;OAKG;IACH,kCAJW,OAAO,gDAAgD,EAAE,OAAO,cAChE,cAAc,yCAAyC,EAAE,OAAO,GAC9D,MAAM,GAAG,SAAS,CAU9B;CACF;wBA3YuB,oCAAoC"}
@@ -2,6 +2,36 @@ import BaseCommand from "../../../../../cli/base-command.js";
2
2
  import fileExists from "../../../../../utils/file-exists.js";
3
3
  import fs from "fs/promises";
4
4
  import * as inflection from "inflection";
5
+ /** Maps an effective column type to the JSDoc type used in generated base models.
6
+ * @type {Record<string, string>} */
7
+ const jsDocTypeByColumnType = {
8
+ bigint: "number",
9
+ bit: "number",
10
+ blob: "string",
11
+ boolean: "boolean",
12
+ char: "string",
13
+ "character varying": "string",
14
+ date: "Date",
15
+ datetime: "Date",
16
+ decimal: "number",
17
+ float: "number",
18
+ int: "number",
19
+ integer: "number",
20
+ json: "Record<string, ?>",
21
+ longtext: "string",
22
+ mediumtext: "string",
23
+ numeric: "number",
24
+ nvarchar: "string",
25
+ smallint: "number",
26
+ text: "string",
27
+ "timestamp without time zone": "Date",
28
+ tinyint: "number",
29
+ tinytext: "string",
30
+ uuid: "string",
31
+ varchar: "string"
32
+ };
33
+ /** Effective column types whose generated setter additionally accepts a string. */
34
+ const setterStringInputColumnTypes = new Set(["date", "datetime", "timestamp without time zone"]);
5
35
  export default class DbGenerateModel extends BaseCommand {
6
36
  async execute() {
7
37
  await this.getConfiguration().initializeModels();
@@ -10,6 +40,7 @@ export default class DbGenerateModel extends BaseCommand {
10
40
  const modelsDir = `${rootDirectory}/src/models`;
11
41
  const baseModelsDir = `${rootDirectory}/src/model-bases`;
12
42
  const modelClasses = this.getConfiguration().getModelClasses();
43
+ const allowMissingTables = Boolean(this.processArgs?.includes("--allow-missing-tables"));
13
44
  let devMode = false;
14
45
  if (baseModelsDir.includes("/spec/dummy/src/model-bases")) {
15
46
  devMode = true;
@@ -22,6 +53,11 @@ export default class DbGenerateModel extends BaseCommand {
22
53
  await this.getConfiguration().ensureConnections({ name: "Generate base models" }, async () => {
23
54
  for (const modelClassName in modelClasses) {
24
55
  const modelClass = modelClasses[modelClassName];
56
+ const table = await modelClass.connection().getTableByName(modelClass.tableName(), { throwError: !allowMissingTables });
57
+ if (!table) {
58
+ console.warn(`Skipping base model for '${modelClass.name}': table '${modelClass.tableName()}' was not found (--allow-missing-tables). Keeping any existing base model.`);
59
+ continue;
60
+ }
25
61
  const modelName = inflection.dasherize(modelClassName);
26
62
  const modelNameCamelized = inflection.camelize(modelName.replaceAll("-", "_"));
27
63
  const modelBaseFileName = `${inflection.dasherize(inflection.underscore(modelName))}.js`;
@@ -63,15 +99,12 @@ export default class DbGenerateModel extends BaseCommand {
63
99
  fileContent += " // @ts-ignore - override narrows return type for better IntelliSense in generated model bases\n";
64
100
  fileContent += ` getModelClass() { return /** @type {typeof ${modelNameCamelized}Base} */ (this.constructor) }\n\n`;
65
101
  }
66
- const table = await modelClass.connection().getTableByName(modelClass.tableName());
67
- if (!table)
68
- throw new Error(`Could not find table for model '${modelClass.name}'`);
69
102
  const columns = await table.getColumns();
70
103
  let methodsCount = 0;
71
104
  for (const column of columns) {
72
105
  const camelizedColumnName = inflection.camelize(column.getName(), true);
73
106
  const camelizedColumnNameBigFirst = inflection.camelize(column.getName());
74
- const jsdocType = this.jsDocTypeFromColumn(column);
107
+ const jsdocType = this.jsDocTypeFromColumn(column, modelClass);
75
108
  if (methodsCount > 0) {
76
109
  fileContent += "\n";
77
110
  }
@@ -81,7 +114,7 @@ export default class DbGenerateModel extends BaseCommand {
81
114
  fileContent += " */\n";
82
115
  }
83
116
  fileContent += ` ${camelizedColumnName}() { return this.readAttribute("${camelizedColumnName}") }\n\n`;
84
- const setterJsdocType = this.jsDocSetterTypeFromColumn(column);
117
+ const setterJsdocType = this.jsDocSetterTypeFromColumn(column, modelClass);
85
118
  if (setterJsdocType) {
86
119
  fileContent += " /**\n";
87
120
  fileContent += ` * @param {${setterJsdocType}${column.getNull() ? " | null" : ""}} newValue\n`;
@@ -103,7 +136,7 @@ export default class DbGenerateModel extends BaseCommand {
103
136
  const column = translationColumns.find((translationColumn) => translationColumn.getName() === nameUnderscore);
104
137
  let translationJsdocType;
105
138
  if (column) {
106
- translationJsdocType = this.jsDocTypeFromColumn(column);
139
+ translationJsdocType = this.jsDocTypeFromColumn(column, TranslationClass);
107
140
  }
108
141
  if (translationJsdocType && column) {
109
142
  fileContent += `\n`;
@@ -128,7 +161,7 @@ export default class DbGenerateModel extends BaseCommand {
128
161
  fileContent += ` * @param {${setterParamType}} newValue\n`;
129
162
  fileContent += ` * @returns {void}\n`;
130
163
  fileContent += " */\n";
131
- fileContent += ` ${setterName}(newValue) { return this._setTranslatedAttribute("${name}", this._getConfiguration().getLocale(), newValue) } // eslint-disable-line no-unused-vars\n`;
164
+ fileContent += ` ${setterName}(newValue) { return this._setTranslatedAttribute("${name}", this._getConfiguration().getLocale(), newValue) }\n`;
132
165
  methodsCount++;
133
166
  for (const locale of this.getConfiguration().getLocales()) {
134
167
  const localeMethodName = `${name}${inflection.camelize(locale)}`;
@@ -146,7 +179,7 @@ export default class DbGenerateModel extends BaseCommand {
146
179
  fileContent += ` * @param {${setterParamType}} newValue\n`;
147
180
  fileContent += ` * @returns {void}\n`;
148
181
  fileContent += " */\n";
149
- fileContent += ` ${localeSetterName}(newValue) { return this._setTranslatedAttribute("${name}", "${locale}", newValue) } // eslint-disable-line no-unused-vars\n`;
182
+ fileContent += ` ${localeSetterName}(newValue) { return this._setTranslatedAttribute("${name}", "${locale}", newValue) }\n`;
150
183
  methodsCount++;
151
184
  const localeHasName = `has${inflection.camelize(localeMethodName)}`;
152
185
  fileContent += `\n`;
@@ -197,7 +230,7 @@ export default class DbGenerateModel extends BaseCommand {
197
230
  fileContent += " * @param {Record<string, ?>} [attributes]\n";
198
231
  fileContent += ` * @returns {import("${modelFilePath}").default}\n`;
199
232
  fileContent += " */\n";
200
- fileContent += ` build${inflection.camelize(relationship.getRelationshipName())}(attributes) { throw new Error("Not implemented") } // eslint-disable-line no-unused-vars\n`;
233
+ fileContent += ` build${inflection.camelize(relationship.getRelationshipName())}(attributes) { void attributes; throw new Error("Not implemented") }\n`;
201
234
  fileContent += "\n";
202
235
  fileContent += " /**\n";
203
236
  fileContent += " * @abstract\n";
@@ -208,14 +241,14 @@ export default class DbGenerateModel extends BaseCommand {
208
241
  fileContent += " /**\n";
209
242
  fileContent += ` * @returns {Promise<import("${modelFilePath}").default | undefined>}\n`;
210
243
  fileContent += " */\n";
211
- fileContent += ` ${relationship.getRelationshipName()}OrLoad() { return this.relationshipOrLoad("${relationship.getRelationshipName()}") }\n`;
244
+ fileContent += ` ${relationship.getRelationshipName()}OrLoad() { return /** @type {Promise<import("${modelFilePath}").default | undefined>} */ (this.relationshipOrLoad("${relationship.getRelationshipName()}")) }\n`;
212
245
  fileContent += "\n";
213
246
  fileContent += " /**\n";
214
247
  fileContent += " * @abstract\n";
215
248
  fileContent += ` * @param {import("${modelFilePath}").default} newModel\n`;
216
249
  fileContent += ` * @returns {void}\n`;
217
250
  fileContent += " */\n";
218
- fileContent += ` set${inflection.camelize(relationship.getRelationshipName())}(newModel) { throw new Error("Not implemented") } // eslint-disable-line no-unused-vars\n`;
251
+ fileContent += ` set${inflection.camelize(relationship.getRelationshipName())}(newModel) { void newModel; throw new Error("Not implemented") }\n`;
219
252
  }
220
253
  else if (relationship.getType() == "hasMany") {
221
254
  let recordImport;
@@ -247,14 +280,14 @@ export default class DbGenerateModel extends BaseCommand {
247
280
  fileContent += " /**\n";
248
281
  fileContent += ` * @returns {Promise<Array<import("${recordImport}").default>>}\n`;
249
282
  fileContent += " */\n";
250
- fileContent += ` ${relationship.getRelationshipName()}OrLoad() { return this.relationshipOrLoad("${relationship.getRelationshipName()}") }\n`;
283
+ fileContent += ` ${relationship.getRelationshipName()}OrLoad() { return /** @type {Promise<Array<import("${recordImport}").default>>} */ (this.relationshipOrLoad("${relationship.getRelationshipName()}")) }\n`;
251
284
  fileContent += "\n";
252
285
  fileContent += " /**\n";
253
286
  fileContent += " * @abstract\n";
254
287
  fileContent += ` * @param {Array<import("${recordImport}").default>} newModels\n`;
255
288
  fileContent += " * @returns {void}\n";
256
289
  fileContent += " */\n";
257
- fileContent += ` set${inflection.camelize(relationship.getRelationshipName())}(newModels) { throw new Error("Not implemented") } // eslint-disable-line no-unused-vars\n`;
290
+ fileContent += ` set${inflection.camelize(relationship.getRelationshipName())}(newModels) { void newModels; throw new Error("Not implemented") }\n`;
258
291
  }
259
292
  else {
260
293
  throw new Error(`Unknown relationship type: ${relationship.getType()}`);
@@ -273,40 +306,30 @@ export default class DbGenerateModel extends BaseCommand {
273
306
  /**
274
307
  * Runs js doc type from column.
275
308
  * @param {import("../../../../../database/drivers/base-column.js").default} column - Column.
309
+ * @param {typeof import("../../../../../database/record/index.js").default} modelClass - Model class owning the column (for declared attribute casts).
276
310
  * @returns {string | undefined} - The js doc type from column.
277
311
  */
278
- jsDocTypeFromColumn(column) {
279
- const type = column.getType();
280
- if (type == "boolean") {
281
- return "boolean";
282
- }
283
- else if (type == "json") {
284
- return "Record<string, ?>";
285
- }
286
- else if (["blob", "char", "nvarchar", "varchar", "text", "tinytext", "mediumtext", "longtext", "uuid", "character varying"].includes(type)) {
287
- return "string";
288
- }
289
- else if (["bit", "bigint", "decimal", "float", "int", "integer", "numeric", "smallint", "tinyint"].includes(type)) {
290
- return "number";
291
- }
292
- else if (["date", "datetime", "timestamp without time zone"].includes(type)) {
293
- return "Date";
294
- }
295
- else {
312
+ jsDocTypeFromColumn(column, modelClass) {
313
+ const type = modelClass.getColumnTypeByName(column.getName());
314
+ const jsDocType = type ? jsDocTypeByColumnType[type] : undefined;
315
+ if (!jsDocType) {
296
316
  console.error(`Unknown column type: ${type}`);
317
+ return undefined;
297
318
  }
319
+ return jsDocType;
298
320
  }
299
321
  /**
300
322
  * Runs js doc setter type from column.
301
323
  * @param {import("../../../../../database/drivers/base-column.js").default} column - Column.
324
+ * @param {typeof import("../../../../../database/record/index.js").default} modelClass - Model class owning the column (for declared attribute casts).
302
325
  * @returns {string | undefined} - The js doc setter type from column.
303
326
  */
304
- jsDocSetterTypeFromColumn(column) {
305
- const type = column.getType();
306
- if (["date", "datetime", "timestamp without time zone"].includes(type)) {
327
+ jsDocSetterTypeFromColumn(column, modelClass) {
328
+ const type = modelClass.getColumnTypeByName(column.getName());
329
+ if (type && setterStringInputColumnTypes.has(type)) {
307
330
  return "Date | string";
308
331
  }
309
- return this.jsDocTypeFromColumn(column);
332
+ return this.jsDocTypeFromColumn(column, modelClass);
310
333
  }
311
334
  }
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxVQUFVLE1BQU0scUNBQXFDLENBQUE7QUFDNUQsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBRXhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQ3RELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRWhELE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsOEJBQThCLEVBQUUsQ0FBQTtRQUU1RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDdEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxhQUFhLGFBQWEsQ0FBQTtRQUMvQyxNQUFNLGFBQWEsR0FBRyxHQUFHLGFBQWEsa0JBQWtCLENBQUE7UUFDeEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDOUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBRW5CLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLENBQUM7WUFDMUQsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNoQixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxF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QUE7UUFDNUIsQ0FBQzthQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdJLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLENBQUM7YUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwSCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5RSxPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx5QkFBeUIsQ0FBQyxNQUFNO1FBQzlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUU3QixJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sZUFBZSxDQUFBO1FBQ3hCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3V0aWxzL2ZpbGUtZXhpc3RzLmpzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERiR2VuZXJhdGVNb2RlbCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICBhd2FpdCB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5pbml0aWFsaXplTW9kZWxzKClcblxuICAgIGNvbnN0IGVuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlcygpXG5cbiAgICBjb25zdCByb290RGlyZWN0b3J5ID0gdGhpcy5kaXJlY3RvcnkoKVxuICAgIGNvbnN0IG1vZGVsc0RpciA9IGAke3Jvb3REaXJlY3Rvcnl9L3NyYy9tb2RlbHNgXG4gICAgY29uc3QgYmFzZU1vZGVsc0RpciA9IGAke3Jvb3REaXJlY3Rvcnl9L3NyYy9tb2RlbC1iYXNlc2BcbiAgICBjb25zdCBtb2RlbENsYXNzZXMgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzZXMoKVxuICAgIGxldCBkZXZNb2RlID0gZmFsc2VcblxuICAgIGlmIChiYXNlTW9kZWxzRGlyLmluY2x1ZGVzKFwiL3NwZWMvZHVtbXkvc3JjL21vZGVsLWJhc2VzXCIpKSB7XG4gICAgICBkZXZNb2RlID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZmlsZUV4aXN0cyhiYXNlTW9kZWxzRGlyKSkge1xuICAgICAgYXdhaXQgZnMubWtkaXIoYmFzZU1vZGVsc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKGZhbHNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkdlbmVyYXRlIGJhc2UgbW9kZWxzXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzc05hbWUgaW4gbW9kZWxDbGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzZXNbbW9kZWxDbGFzc05hbWVdXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKG1vZGVsQ2xhc3NOYW1lKVxuICAgICAgICBjb25zdCBtb2RlbE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IG1vZGVsQmFzZUZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gYCR7YmFzZU1vZGVsc0Rpcn0vJHttb2RlbEJhc2VGaWxlTmFtZX1gXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvbW9kZWwtYmFzZXMvJHttb2RlbEJhc2VGaWxlTmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoID0gYCR7bW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgbGV0IHNvdXJjZU1vZGVsRmlsZVBhdGhcblxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG4gICAgICAgIGxldCB2ZWxvY2lvdXNQYXRoXG5cbiAgICAgICAgaWYgKGRldk1vZGUpIHtcbiAgICAgICAgICB2ZWxvY2lvdXNQYXRoID0gXCIuLi8uLi8uLi8uLi9zcmNcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmNcIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYGltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxcblxcbmBcblxuICAgICAgICBjb25zdCBoYXNNYW55UmVsYXRpb25GaWxlUGF0aCA9IGAke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbnN0YW5jZS1yZWxhdGlvbnNoaXBzL2hhcy1tYW55LmpzYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGBleHBvcnQgZGVmYXVsdCBjbGFzcyAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlIGV4dGVuZHMgRGF0YWJhc2VSZWNvcmQge1xcbmBcblxuICAgICAgLy8gLS0tIGdldE1vZGVsQ2xhc3MoKSBvdmVycmlkZSAoZml4ZXMgcG9seW1vcnBoaWMgdHlwaW5nIGluIEpTL0pTRG9jKSAtLS1cbiAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAvLyBNb2RlbCBmaWxlIGV4aXN0cyAoZS5nLiBzcmMvbW9kZWxzL3RpY2tldC5qcykg4oaSIHJldHVybiB0eXBlb2YgVGlja2V0XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLy8gQHRzLWlnbm9yZSAtIG92ZXJyaWRlIG5hcnJvd3MgcmV0dXJuIHR5cGUgZm9yIGJldHRlciBJbnRlbGxpU2Vuc2UgaW4gZ2VuZXJhdGVkIG1vZGVsIGJhc2VzXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgZ2V0TW9kZWxDbGFzcygpIHsgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gKi8gKHRoaXMuY29uc3RydWN0b3IpIH1cXG5cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBtb2RlbCBmaWxlIHlldCDihpIgZmFsbCBiYWNrIHRvIHR5cGVvZiBUaWNrZXRCYXNlXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mICR7bW9kZWxOYW1lQ2FtZWxpemVkfUJhc2V9XFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8vIEB0cy1pZ25vcmUgLSBvdmVycmlkZSBuYXJyb3dzIHJldHVybiB0eXBlIGZvciBiZXR0ZXIgSW50ZWxsaVNlbnNlIGluIGdlbmVyYXRlZCBtb2RlbCBiYXNlc1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGdldE1vZGVsQ2xhc3MoKSB7IHJldHVybiAvKiogQHR5cGUge3R5cGVvZiAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikgfVxcblxcbmBcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5nZXRUYWJsZUJ5TmFtZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuXG4gICAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRhYmxlIGZvciBtb2RlbCAnJHttb2RlbENsYXNzLm5hbWV9J2ApXG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKClcbiAgICAgIGxldCBtZXRob2RzQ291bnQgPSAwXG5cbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY2FtZWxpemVkQ29sdW1uTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoY29sdW1uLmdldE5hbWUoKSwgdHJ1ZSlcbiAgICAgICAgY29uc3QgY2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0ID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShjb2x1bW4uZ2V0TmFtZSgpKVxuICAgICAgICBjb25zdCBqc2RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZyb21Db2x1bW4oY29sdW1uKVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzZG9jVHlwZSkge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske2pzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSB7IHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIpIH1cXG5cXG5gXG5cbiAgICAgICAgY29uc3Qgc2V0dGVySnNkb2NUeXBlID0gdGhpcy5qc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbilcblxuICAgICAgICBpZiAoc2V0dGVySnNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlckpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0Q29sdW1uQXR0cmlidXRlKFwiJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfVwiLCBuZXdWYWx1ZSkgfVxcblxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtib29sZWFufVxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBoYXMke2NhbWVsaXplZENvbHVtbk5hbWVCaWdGaXJzdH0oKSB7IHJldHVybiB0aGlzLl9oYXNBdHRyaWJ1dGUodGhpcy4ke2NhbWVsaXplZENvbHVtbk5hbWV9KCkpIH1cXG5gXG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2RlbENsYXNzLCBcIl90cmFuc2xhdGlvbnNcIikgJiYgbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zICYmIE9iamVjdC5rZXlzKG1vZGVsQ2xhc3MuX3RyYW5zbGF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBUcmFuc2xhdGlvbkNsYXNzID0gbW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25Db2x1bW5zID0gVHJhbnNsYXRpb25DbGFzcy5nZXRDb2x1bW5zKClcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgbmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUobmFtZSlcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0cmFuc2xhdGlvbkNvbHVtbnMuZmluZCgodHJhbnNsYXRpb25Db2x1bW4pID0+IHRyYW5zbGF0aW9uQ29sdW1uLmdldE5hbWUoKSA9PT0gbmFtZVVuZGVyc2NvcmUpXG4gICAgICAgICAgbGV0IHRyYW5zbGF0aW9uSnNkb2NUeXBlXG5cbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICB0cmFuc2xhdGlvbkpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyYW5zbGF0aW9uSnNkb2NUeXBlICYmIGNvbHVtbikge1xuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke25hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpKSA/PyBudWxsIH1cXG5gXG4gICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgIGNvbnN0IGhhc05hbWUgPSBgaGFzJHtpbmZsZWN0aW9uLmNhbWVsaXplKG5hbWUpfWBcbiAgICAgICAgICBjb25zdCBzZXR0ZXJOYW1lID0gYHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShuYW1lKX1gXG4gICAgICAgICAgY29uc3Qgc2V0dGVyUGFyYW1UeXBlID0gdHJhbnNsYXRpb25Kc2RvY1R5cGUgfHwgXCI/XCJcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQGFic3RyYWN0XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtib29sZWFufVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2hhc05hbWV9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCIke2hhc05hbWV9IG5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7JHtzZXR0ZXJQYXJhbVR5cGV9fSBuZXdWYWx1ZVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtzZXR0ZXJOYW1lfShuZXdWYWx1ZSkgeyByZXR1cm4gdGhpcy5fc2V0VHJhbnNsYXRlZEF0dHJpYnV0ZShcIiR7bmFtZX1cIiwgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZSgpLCBuZXdWYWx1ZSkgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMb2NhbGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZU1ldGhvZE5hbWUgPSBgJHtuYW1lfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGUpfWBcblxuICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uSnNkb2NUeXBlICYmIGNvbHVtbikge1xuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZU1ldGhvZE5hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgXCIke2xvY2FsZX1cIikgPz8gbnVsbCB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxlU2V0dGVyTmFtZSA9IGAke3NldHRlck5hbWV9JHtpbmZsZWN0aW9uLmNhbWVsaXplKGxvY2FsZSl9YFxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyUGFyYW1UeXBlfX0gbmV3VmFsdWVcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bG9jYWxlU2V0dGVyTmFtZX0obmV3VmFsdWUpIHsgcmV0dXJuIHRoaXMuX3NldFRyYW5zbGF0ZWRBdHRyaWJ1dGUoXCIke25hbWV9XCIsIFwiJHtsb2NhbGV9XCIsIG5ld1ZhbHVlKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcXG5gXG4gICAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgICBjb25zdCBsb2NhbGVIYXNOYW1lID0gYGhhcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGVNZXRob2ROYW1lKX1gXG5cbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBhYnN0cmFjdFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtib29sZWFufVxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtsb2NhbGVIYXNOYW1lfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiJHtsb2NhbGVIYXNOYW1lfSBub3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwcygpKSB7XG4gICAgICAgIGxldCBiYXNlRmlsZVBhdGgsIGJhc2VGdWxsRmlsZVBhdGgsIGZpbGVOYW1lLCBmdWxsRmlsZVBhdGhcblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IFwidmVsb2Npb3VzL2J1aWxkL3NyYy9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9JyBvbiAnJHttb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfScgaGFzIG5vIHRhcmdldCBtb2RlbCBjbGFzc2ApXG5cbiAgICAgICAgICBmaWxlTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZSh0YXJnZXRNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpKSlcbiAgICAgICAgICBmdWxsRmlsZVBhdGggPSBgc3JjL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICBiYXNlRmlsZVBhdGggPSBgLi4vbW9kZWwtYmFzZXMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgYmFzZUZ1bGxGaWxlUGF0aCA9IGBzcmMvbW9kZWwtYmFzZXMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kc0NvdW50ID4gMCkge1xuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiYmVsb25nc1RvXCIgfHwgcmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImhhc09uZVwiKSB7XG4gICAgICAgICAgbGV0IG1vZGVsRmlsZVBhdGhcblxuICAgICAgICAgIGlmIChmdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhmdWxsRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBtb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VGdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhiYXNlRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgbW9kZWxGaWxlUGF0aCA9IGJhc2VGaWxlUGF0aFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpLmxvYWRlZCgpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXR0cmlidXRlc11cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGJ1aWxkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfShhdHRyaWJ1dGVzKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0IHwgdW5kZWZpbmVkPn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgbG9hZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCB8IHVuZGVmaW5lZD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1PckxvYWQoKSB7IHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE9yTG9hZChcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0ge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gbmV3TW9kZWxcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3ZvaWR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0obmV3TW9kZWwpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xcbmBcbiAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzTWFueVwiKSB7XG4gICAgICAgICAgbGV0IHJlY29yZEltcG9ydFxuXG4gICAgICAgICAgaWYgKGZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJlY29yZEltcG9ydCA9IGAuLi9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgfSBlbHNlIGlmIChiYXNlRnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoYmFzZUZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJlY29yZEltcG9ydCA9IGAuLi9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYCR7dmVsb2Npb3VzUGF0aH0vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzYFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke2hhc01hbnlSZWxhdGlvbkZpbGVQYXRofVwiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQsIHR5cGVvZiBpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9TG9hZGVkKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgbG9hZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pj59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1PckxvYWQoKSB7IHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE9yTG9hZChcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gbmV3TW9kZWxzXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0obmV3TW9kZWxzKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcXG5gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJlbGF0aW9uc2hpcCB0eXBlOiAke3JlbGF0aW9uc2hpcC5nZXRUeXBlKCl9YClcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGhvZHNDb3VudCsrXG4gICAgICB9XG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwifVxcblwiXG5cbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKG1vZGVsUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3BlcyhlbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMganMgZG9jIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGpzIGRvYyB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCB0eXBlID0gY29sdW1uLmdldFR5cGUoKVxuXG4gICAgaWYgKHR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIlxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgPz5cIlxuICAgIH0gZWxzZSBpZiAoW1wiYmxvYlwiLCBcImNoYXJcIiwgXCJudmFyY2hhclwiLCBcInZhcmNoYXJcIiwgXCJ0ZXh0XCIsIFwidGlueXRleHRcIiwgXCJtZWRpdW10ZXh0XCIsIFwibG9uZ3RleHRcIiwgXCJ1dWlkXCIsIFwiY2hhcmFjdGVyIHZhcnlpbmdcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfSBlbHNlIGlmIChbXCJiaXRcIiwgXCJiaWdpbnRcIiwgXCJkZWNpbWFsXCIsIFwiZmxvYXRcIiwgXCJpbnRcIiwgXCJpbnRlZ2VyXCIsIFwibnVtZXJpY1wiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCJcbiAgICB9IGVsc2UgaWYgKFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZVwiXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gY29sdW1uIHR5cGU6ICR7dHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyBzZXR0ZXIgdHlwZSBmcm9tIGNvbHVtbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbi5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUganMgZG9jIHNldHRlciB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NTZXR0ZXJUeXBlRnJvbUNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCB0eXBlID0gY29sdW1uLmdldFR5cGUoKVxuXG4gICAgaWYgKFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZSB8IHN0cmluZ1wiXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pXG4gIH1cbn1cbiJdfQ==
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxVQUFVLE1BQU0scUNBQXFDLENBQUE7QUFDNUQsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBRXhDO3FDQUNxQztBQUNyQyxNQUFNLHFCQUFxQixHQUFHO0lBQzVCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEdBQUcsRUFBRSxRQUFRO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxPQUFPLEVBQUUsU0FBUztJQUNsQixJQUFJLEVBQUUsUUFBUTtJQUNkLG1CQUFtQixFQUFFLFFBQVE7SUFDN0IsSUFBSSxFQUFFLE1BQU07SUFDWixRQUFRLEVBQUUsTUFBTTtJQUNoQixPQUFPLEVBQUUsUUFBUTtJQUNqQixLQUFLLEVBQUUsUUFBUTtJQUNmLEdBQUcsRUFBRSxRQUFRO0lBQ2IsT0FBTyxFQUFFLFFBQVE7SUFDakIsSUFBSSxFQUFFLG1CQUFtQjtJQUN6QixRQUFRLEVBQUUsUUFBUTtJQUNsQixVQUFVLEVBQUUsUUFBUTtJQUNwQixPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsUUFBUTtJQUNsQixRQUFRLEVBQUUsUUFBUTtJQUNsQixJQUFJLEVBQUUsUUFBUTtJQUNkLDZCQUE2QixFQUFFLE1BQU07SUFDckMsT0FBTyxFQUFFLFFBQVE7SUFDakIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsSUFBSSxFQUFFLFFBQVE7SUFDZCxPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFBO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxH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QyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUE7WUFFN0MsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHlCQUF5QixDQUFDLE1BQU0sRUFBRSxVQUFVO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUU3RCxJQUFJLElBQUksSUFBSSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLGVBQWUsQ0FBQTtRQUN4QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3JELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZmlsZUV4aXN0cyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdXRpbHMvZmlsZS1leGlzdHMuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcblxuLyoqIE1hcHMgYW4gZWZmZWN0aXZlIGNvbHVtbiB0eXBlIHRvIHRoZSBKU0RvYyB0eXBlIHVzZWQgaW4gZ2VuZXJhdGVkIGJhc2UgbW9kZWxzLlxuICogIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuY29uc3QganNEb2NUeXBlQnlDb2x1bW5UeXBlID0ge1xuICBiaWdpbnQ6IFwibnVtYmVyXCIsXG4gIGJpdDogXCJudW1iZXJcIixcbiAgYmxvYjogXCJzdHJpbmdcIixcbiAgYm9vbGVhbjogXCJib29sZWFuXCIsXG4gIGNoYXI6IFwic3RyaW5nXCIsXG4gIFwiY2hhcmFjdGVyIHZhcnlpbmdcIjogXCJzdHJpbmdcIixcbiAgZGF0ZTogXCJEYXRlXCIsXG4gIGRhdGV0aW1lOiBcIkRhdGVcIixcbiAgZGVjaW1hbDogXCJudW1iZXJcIixcbiAgZmxvYXQ6IFwibnVtYmVyXCIsXG4gIGludDogXCJudW1iZXJcIixcbiAgaW50ZWdlcjogXCJudW1iZXJcIixcbiAganNvbjogXCJSZWNvcmQ8c3RyaW5nLCA/PlwiLFxuICBsb25ndGV4dDogXCJzdHJpbmdcIixcbiAgbWVkaXVtdGV4dDogXCJzdHJpbmdcIixcbiAgbnVtZXJpYzogXCJudW1iZXJcIixcbiAgbnZhcmNoYXI6IFwic3RyaW5nXCIsXG4gIHNtYWxsaW50OiBcIm51bWJlclwiLFxuICB0ZXh0OiBcInN0cmluZ1wiLFxuICBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiOiBcIkRhdGVcIixcbiAgdGlueWludDogXCJudW1iZXJcIixcbiAgdGlueXRleHQ6IFwic3RyaW5nXCIsXG4gIHV1aWQ6IFwic3RyaW5nXCIsXG4gIHZhcmNoYXI6IFwic3RyaW5nXCJcbn1cblxuLyoqIEVmZmVjdGl2ZSBjb2x1bW4gdHlwZXMgd2hvc2UgZ2VuZXJhdGVkIHNldHRlciBhZGRpdGlvbmFsbHkgYWNjZXB0cyBhIHN0cmluZy4gKi9cbmNvbnN0IHNldHRlclN0cmluZ0lucHV0Q29sdW1uVHlwZXMgPSBuZXcgU2V0KFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXSlcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZU1vZGVsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmluaXRpYWxpemVNb2RlbHMoKVxuXG4gICAgY29uc3QgZW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKClcblxuICAgIGNvbnN0IHJvb3REaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgY29uc3QgbW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsc2BcbiAgICBjb25zdCBiYXNlTW9kZWxzRGlyID0gYCR7cm9vdERpcmVjdG9yeX0vc3JjL21vZGVsLWJhc2VzYFxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgYWxsb3dNaXNzaW5nVGFibGVzID0gQm9vbGVhbih0aGlzLnByb2Nlc3NBcmdzPy5pbmNsdWRlcyhcIi0tYWxsb3ctbWlzc2luZy10YWJsZXNcIikpXG4gICAgbGV0IGRldk1vZGUgPSBmYWxzZVxuXG4gICAgaWYgKGJhc2VNb2RlbHNEaXIuaW5jbHVkZXMoXCIvc3BlYy9kdW1teS9zcmMvbW9kZWwtYmFzZXNcIikpIHtcbiAgICAgIGRldk1vZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBmaWxlRXhpc3RzKGJhc2VNb2RlbHNEaXIpKSB7XG4gICAgICBhd2FpdCBmcy5ta2RpcihiYXNlTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICB9XG5cbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXMoZmFsc2UpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiR2VuZXJhdGUgYmFzZSBtb2RlbHNcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiBtb2RlbENsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzTmFtZV1cbiAgICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5nZXRUYWJsZUJ5TmFtZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpLCB7dGhyb3dFcnJvcjogIWFsbG93TWlzc2luZ1RhYmxlc30pXG5cbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBpbmcgYmFzZSBtb2RlbCBmb3IgJyR7bW9kZWxDbGFzcy5uYW1lfSc6IHRhYmxlICcke21vZGVsQ2xhc3MudGFibGVOYW1lKCl9JyB3YXMgbm90IGZvdW5kICgtLWFsbG93LW1pc3NpbmctdGFibGVzKS4gS2VlcGluZyBhbnkgZXhpc3RpbmcgYmFzZSBtb2RlbC5gKVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKG1vZGVsQ2xhc3NOYW1lKVxuICAgICAgICBjb25zdCBtb2RlbE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IG1vZGVsQmFzZUZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gYCR7YmFzZU1vZGVsc0Rpcn0vJHttb2RlbEJhc2VGaWxlTmFtZX1gXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvbW9kZWwtYmFzZXMvJHttb2RlbEJhc2VGaWxlTmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoID0gYCR7bW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgbGV0IHNvdXJjZU1vZGVsRmlsZVBhdGhcblxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG4gICAgICAgIGxldCB2ZWxvY2lvdXNQYXRoXG5cbiAgICAgICAgaWYgKGRldk1vZGUpIHtcbiAgICAgICAgICB2ZWxvY2lvdXNQYXRoID0gXCIuLi8uLi8uLi8uLi9zcmNcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmNcIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYGltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxcblxcbmBcblxuICAgICAgICBjb25zdCBoYXNNYW55UmVsYXRpb25GaWxlUGF0aCA9IGAke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbnN0YW5jZS1yZWxhdGlvbnNoaXBzL2hhcy1tYW55LmpzYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGBleHBvcnQgZGVmYXVsdCBjbGFzcyAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlIGV4dGVuZHMgRGF0YWJhc2VSZWNvcmQge1xcbmBcblxuICAgICAgLy8gLS0tIGdldE1vZGVsQ2xhc3MoKSBvdmVycmlkZSAoZml4ZXMgcG9seW1vcnBoaWMgdHlwaW5nIGluIEpTL0pTRG9jKSAtLS1cbiAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAvLyBNb2RlbCBmaWxlIGV4aXN0cyAoZS5nLiBzcmMvbW9kZWxzL3RpY2tldC5qcykg4oaSIHJldHVybiB0eXBlb2YgVGlja2V0XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLy8gQHRzLWlnbm9yZSAtIG92ZXJyaWRlIG5hcnJvd3MgcmV0dXJuIHR5cGUgZm9yIGJldHRlciBJbnRlbGxpU2Vuc2UgaW4gZ2VuZXJhdGVkIG1vZGVsIGJhc2VzXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgZ2V0TW9kZWxDbGFzcygpIHsgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gKi8gKHRoaXMuY29uc3RydWN0b3IpIH1cXG5cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBtb2RlbCBmaWxlIHlldCDihpIgZmFsbCBiYWNrIHRvIHR5cGVvZiBUaWNrZXRCYXNlXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mICR7bW9kZWxOYW1lQ2FtZWxpemVkfUJhc2V9XFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8vIEB0cy1pZ25vcmUgLSBvdmVycmlkZSBuYXJyb3dzIHJldHVybiB0eXBlIGZvciBiZXR0ZXIgSW50ZWxsaVNlbnNlIGluIGdlbmVyYXRlZCBtb2RlbCBiYXNlc1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGdldE1vZGVsQ2xhc3MoKSB7IHJldHVybiAvKiogQHR5cGUge3R5cGVvZiAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikgfVxcblxcbmBcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKVxuICAgICAgbGV0IG1ldGhvZHNDb3VudCA9IDBcblxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShjb2x1bW4uZ2V0TmFtZSgpLCB0cnVlKVxuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3QgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCkpXG4gICAgICAgIGNvbnN0IGpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4sIG1vZGVsQ2xhc3MpXG5cbiAgICAgICAgaWYgKG1ldGhvZHNDb3VudCA+IDApIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7anNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZShcIiR7Y2FtZWxpemVkQ29sdW1uTmFtZX1cIikgfVxcblxcbmBcblxuICAgICAgICBjb25zdCBzZXR0ZXJKc2RvY1R5cGUgPSB0aGlzLmpzRG9jU2V0dGVyVHlwZUZyb21Db2x1bW4oY29sdW1uLCBtb2RlbENsYXNzKVxuXG4gICAgICAgIGlmIChzZXR0ZXJKc2RvY1R5cGUpIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVySnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3R9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRDb2x1bW5BdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIsIG5ld1ZhbHVlKSB9XFxuXFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge2Jvb2xlYW59XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGhhcyR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fSgpIHsgcmV0dXJuIHRoaXMuX2hhc0F0dHJpYnV0ZSh0aGlzLiR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSkgfVxcbmBcblxuICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsQ2xhc3MsIFwiX3RyYW5zbGF0aW9uc1wiKSAmJiBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnMgJiYgT2JqZWN0LmtleXMobW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IFRyYW5zbGF0aW9uQ2xhc3MgPSBtb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uQ2xhc3MoKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbkNvbHVtbnMgPSBUcmFuc2xhdGlvbkNsYXNzLmdldENvbHVtbnMoKVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShuYW1lKVxuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRyYW5zbGF0aW9uQ29sdW1ucy5maW5kKCh0cmFuc2xhdGlvbkNvbHVtbikgPT4gdHJhbnNsYXRpb25Db2x1bW4uZ2V0TmFtZSgpID09PSBuYW1lVW5kZXJzY29yZSlcbiAgICAgICAgICBsZXQgdHJhbnNsYXRpb25Kc2RvY1R5cGVcblxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uSnNkb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbiwgVHJhbnNsYXRpb25DbGFzcylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJhbnNsYXRpb25Kc2RvY1R5cGUgJiYgY29sdW1uKSB7XG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0cmFuc2xhdGlvbkpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bmFtZX0oKSB7IHJldHVybiB0aGlzLl9nZXRUcmFuc2xhdGVkQXR0cmlidXRlV2l0aEZhbGxiYWNrKFwiJHtuYW1lfVwiLCB0aGlzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlKCkpID8/IG51bGwgfVxcbmBcbiAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgY29uc3QgaGFzTmFtZSA9IGBoYXMke2luZmxlY3Rpb24uY2FtZWxpemUobmFtZSl9YFxuICAgICAgICAgIGNvbnN0IHNldHRlck5hbWUgPSBgc2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKG5hbWUpfWBcbiAgICAgICAgICBjb25zdCBzZXR0ZXJQYXJhbVR5cGUgPSB0cmFuc2xhdGlvbkpzZG9jVHlwZSB8fCBcIj9cIlxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAYWJzdHJhY3RcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2Jvb2xlYW59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7aGFzTmFtZX0oKSB7IHRocm93IG5ldyBFcnJvcihcIiR7aGFzTmFtZX0gbm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG4gICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske3NldHRlclBhcmFtVHlwZX19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt2b2lkfVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3NldHRlck5hbWV9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRUcmFuc2xhdGVkQXR0cmlidXRlKFwiJHtuYW1lfVwiLCB0aGlzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlKCksIG5ld1ZhbHVlKSB9XFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRMb2NhbGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsZU1ldGhvZE5hbWUgPSBgJHtuYW1lfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGUpfWBcblxuICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uSnNkb2NUeXBlICYmIGNvbHVtbikge1xuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZU1ldGhvZE5hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgXCIke2xvY2FsZX1cIikgPz8gbnVsbCB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxlU2V0dGVyTmFtZSA9IGAke3NldHRlck5hbWV9JHtpbmZsZWN0aW9uLmNhbWVsaXplKGxvY2FsZSl9YFxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVyUGFyYW1UeXBlfX0gbmV3VmFsdWVcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bG9jYWxlU2V0dGVyTmFtZX0obmV3VmFsdWUpIHsgcmV0dXJuIHRoaXMuX3NldFRyYW5zbGF0ZWRBdHRyaWJ1dGUoXCIke25hbWV9XCIsIFwiJHtsb2NhbGV9XCIsIG5ld1ZhbHVlKSB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxlSGFzTmFtZSA9IGBoYXMke2luZmxlY3Rpb24uY2FtZWxpemUobG9jYWxlTWV0aG9kTmFtZSl9YFxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAYWJzdHJhY3RcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bG9jYWxlSGFzTmFtZX0oKSB7IHRocm93IG5ldyBFcnJvcihcIiR7bG9jYWxlSGFzTmFtZX0gbm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG4gICAgICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcHMoKSkge1xuICAgICAgICBsZXQgYmFzZUZpbGVQYXRoLCBiYXNlRnVsbEZpbGVQYXRoLCBmaWxlTmFtZSwgZnVsbEZpbGVQYXRoXG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgICAgICAgZmlsZU5hbWUgPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfScgb24gJyR7bW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuXG4gICAgICAgICAgZmlsZU5hbWUgPSBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGFyZ2V0TW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSkpXG4gICAgICAgICAgZnVsbEZpbGVQYXRoID0gYHNyYy9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgYmFzZUZpbGVQYXRoID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIGJhc2VGdWxsRmlsZVBhdGggPSBgc3JjL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZHNDb3VudCA+IDApIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImJlbG9uZ3NUb1wiIHx8IHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNPbmVcIikge1xuICAgICAgICAgIGxldCBtb2RlbEZpbGVQYXRoXG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgbW9kZWxGaWxlUGF0aCA9IGAuLi9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgfSBlbHNlIGlmIChiYXNlRnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoYmFzZUZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBiYXNlRmlsZVBhdGhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9kZWxGaWxlUGF0aCA9IFwidmVsb2Npb3VzL2J1aWxkL3NyYy9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2F0dHJpYnV0ZXNdXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBidWlsZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oYXR0cmlidXRlcykgeyB2b2lkIGF0dHJpYnV0ZXM7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCB8IHVuZGVmaW5lZD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGxvYWQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQgfCB1bmRlZmluZWQ+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9T3JMb2FkKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPGltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCB8IHVuZGVmaW5lZD59ICovICh0aGlzLnJlbGF0aW9uc2hpcE9yTG9hZChcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9IG5ld01vZGVsXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt2b2lkfVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KG5ld01vZGVsKSB7IHZvaWQgbmV3TW9kZWw7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgICBsZXQgcmVjb3JkSW1wb3J0XG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VGdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhiYXNlRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWNvcmRJbXBvcnQgPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiJHtoYXNNYW55UmVsYXRpb25GaWxlUGF0aH1cIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0LCB0eXBlb2YgaW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1Mb2FkZWQoKSB7IHJldHVybiAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD4+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfU9yTG9hZCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD4+fSAqLyAodGhpcy5yZWxhdGlvbnNoaXBPckxvYWQoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSBuZXdNb2RlbHNcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHt2b2lkfVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfShuZXdNb2RlbHMpIHsgdm9pZCBuZXdNb2RlbHM7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxhdGlvbnNoaXAgdHlwZTogJHtyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpfWApXG4gICAgICAgIH1cblxuICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgfVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShtb2RlbFBhdGgsIGZpbGVDb250ZW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXMoZW5mb3JjZVRlbmFudERhdGFiYXNlU2NvcGVzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGpzIGRvYyB0eXBlIGZyb20gY29sdW1uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIG93bmluZyB0aGUgY29sdW1uIChmb3IgZGVjbGFyZWQgYXR0cmlidXRlIGNhc3RzKS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUganMgZG9jIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqL1xuICBqc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uLmdldE5hbWUoKSlcbiAgICBjb25zdCBqc0RvY1R5cGUgPSB0eXBlID8ganNEb2NUeXBlQnlDb2x1bW5UeXBlW3R5cGVdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoIWpzRG9jVHlwZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb2x1bW4gdHlwZTogJHt0eXBlfWApXG5cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4ganNEb2NUeXBlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqcyBkb2Mgc2V0dGVyIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3Mgb3duaW5nIHRoZSBjb2x1bW4gKGZvciBkZWNsYXJlZCBhdHRyaWJ1dGUgY2FzdHMpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBqcyBkb2Mgc2V0dGVyIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqL1xuICBqc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHR5cGUgPSBtb2RlbENsYXNzLmdldENvbHVtblR5cGVCeU5hbWUoY29sdW1uLmdldE5hbWUoKSlcblxuICAgIGlmICh0eXBlICYmIHNldHRlclN0cmluZ0lucHV0Q29sdW1uVHlwZXMuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJEYXRlIHwgc3RyaW5nXCJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbiwgbW9kZWxDbGFzcylcbiAgfVxufVxuIl19
@@ -174,9 +174,9 @@ export default class FrontendModelController extends Controller {
174
174
  /**
175
175
  * Runs frontend model authorized query.
176
176
  * @param {"index" | "find" | "create" | "update" | "destroy" | "attach" | "download" | "url"} action - Frontend action.
177
- * @returns {import("./database/query/model-class-query.js").default<?>} - Authorized query for the action.
177
+ * @returns {import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>} - Authorized query for the action.
178
178
  */
179
- frontendModelAuthorizedQuery(action: "index" | "find" | "create" | "update" | "destroy" | "attach" | "download" | "url"): import("./database/query/model-class-query.js").default<unknown>;
179
+ frontendModelAuthorizedQuery(action: "index" | "find" | "create" | "update" | "destroy" | "attach" | "download" | "url"): import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>;
180
180
  /**
181
181
  * Runs frontend model primary key value.
182
182
  * @param {import("./database/record/index.js").default} model - Model instance.
@@ -537,12 +537,12 @@ export default class FrontendModelController extends Controller {
537
537
  /**
538
538
  * Runs apply frontend model translated attribute preloads.
539
539
  * @param {object} args - Args.
540
- * @param {import("./database/query/model-class-query.js").default<?>} args.query - Query instance.
541
- * @returns {import("./database/query/model-class-query.js").default<?>} - Query with translations preloaded if needed.
540
+ * @param {import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>} args.query - Query instance.
541
+ * @returns {import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>} - Query with translations preloaded if needed.
542
542
  */
543
543
  applyFrontendModelTranslatedAttributePreloads({ query }: {
544
- query: import("./database/query/model-class-query.js").default<unknown>;
545
- }): import("./database/query/model-class-query.js").default<unknown>;
544
+ query: import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>;
545
+ }): import("./database/query/model-class-query.js").default<typeof import("./database/record/index.js").default>;
546
546
  /**
547
547
  * Runs apply frontend model sort.
548
548
  * @param {object} args - Sort args.