@restforgejs/platform 4.1.1 → 4.3.1

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 (340) hide show
  1. package/SECURITY.md +83 -4
  2. package/bin/sdf-tools.exe +0 -0
  3. package/build-info.json +2 -2
  4. package/cli/consumer-deploy.js +1 -1
  5. package/cli/consumer.js +1 -1
  6. package/generators/cli/dashboard/create.js +4 -1
  7. package/generators/cli/endpoint/create.js +43 -4
  8. package/generators/cli/key/generate.js +2 -1
  9. package/generators/cli/key/revoke.js +2 -1
  10. package/generators/cli/payload/diff.js +3 -2
  11. package/generators/cli/payload/generate.js +3 -2
  12. package/generators/cli/payload/sync.js +3 -2
  13. package/generators/cli/payload/validate.js +3 -2
  14. package/generators/cli/processor/create.js +14 -3
  15. package/generators/cli/project/delete.js +2 -1
  16. package/generators/cli/query/validate.js +3 -2
  17. package/generators/cli/schema/apply.js +526 -0
  18. package/generators/cli/schema/describe.js +3 -2
  19. package/generators/cli/schema/diff.js +322 -0
  20. package/generators/cli/schema/generate-ddl.js +7 -10
  21. package/generators/cli/schema/init.js +95 -172
  22. package/generators/cli/schema/introspect.js +3 -2
  23. package/generators/cli/schema/list.js +3 -2
  24. package/generators/cli/schema/migrate.js +13 -18
  25. package/generators/cli/schema/models.js +8 -12
  26. package/generators/cli/schema/template.js +222 -0
  27. package/generators/cli/schema/validate.js +8 -12
  28. package/generators/cli-entry.js +17 -2
  29. package/generators/lib/dbschema-kit/apply-engine.js +582 -0
  30. package/generators/lib/dbschema-kit/diff-engine.js +703 -0
  31. package/generators/lib/dbschema-kit/diff-reporter.js +272 -0
  32. package/generators/lib/dbschema-kit/emitters/alter-table.js +275 -0
  33. package/generators/lib/migration/audit-table-runner.js +213 -215
  34. package/generators/lib/payload/endpoint-schema-validator.js +171 -0
  35. package/generators/lib/payload/payload-runner.js +137 -220
  36. package/generators/lib/payload/schema-diff.js +277 -0
  37. package/generators/lib/templates/dashboard-catalog.js +1 -437
  38. package/generators/lib/templates/db-connection-env.js +1 -212
  39. package/generators/lib/templates/dbschema-catalog.js +1 -489
  40. package/generators/lib/templates/field-validation-catalog.js +1 -531
  41. package/generators/lib/templates/mysql-template.js +1 -3863
  42. package/generators/lib/templates/oracle-template.js +1 -3915
  43. package/generators/lib/templates/postgres-template.js +1 -5838
  44. package/generators/lib/templates/query-declarative-catalog.js +1 -199
  45. package/generators/lib/templates/sqlite-template.js +1 -3440
  46. package/generators/lib/utils/audit-columns.js +181 -0
  47. package/generators/lib/utils/cli-output.js +17 -0
  48. package/generators/lib/utils/database-introspector.js +16 -13
  49. package/generators/lib/utils/env-manager.js +6 -0
  50. package/generators/lib/utils/path-validator.js +71 -0
  51. package/generators/lib/validators/payload-validator.js +1 -2
  52. package/integrity-manifest.json +28 -10
  53. package/package.json +11 -3
  54. package/scripts/verify-integrity.js +1 -1
  55. package/server.js +1 -1
  56. package/src/components/handlers/adjust_handler.js +1 -1
  57. package/src/components/handlers/audit_handler.js +1 -1
  58. package/src/components/handlers/delete_handler.js +1 -1
  59. package/src/components/handlers/export_handler.js +1 -1
  60. package/src/components/handlers/import_handler.js +1 -1
  61. package/src/components/handlers/insert_handler.js +1 -1
  62. package/src/components/handlers/update_handler.js +1 -1
  63. package/src/components/handlers/upload_handler.js +1 -1
  64. package/src/components/handlers/workflow_handler.js +1 -1
  65. package/src/components/integrations/webhook.js +1 -1
  66. package/src/consumers/baseConsumer.js +1 -1
  67. package/src/consumers/declarativeMapper.js +1 -1
  68. package/src/consumers/handlers/apiHandler.js +1 -1
  69. package/src/consumers/handlers/consoleHandler.js +1 -1
  70. package/src/consumers/handlers/databaseHandler.js +1 -1
  71. package/src/consumers/handlers/index.js +1 -1
  72. package/src/consumers/handlers/kafkaHandler.js +1 -1
  73. package/src/consumers/index.js +1 -1
  74. package/src/consumers/messageTransformer.js +1 -1
  75. package/src/consumers/validator.js +1 -1
  76. package/src/core/db/dialect/base-dialect.js +1 -1
  77. package/src/core/db/dialect/index.js +1 -1
  78. package/src/core/db/dialect/mysql-dialect.js +1 -1
  79. package/src/core/db/dialect/oracle-dialect.js +1 -1
  80. package/src/core/db/dialect/postgres-dialect.js +1 -1
  81. package/src/core/db/dialect/sqlite-dialect.js +1 -1
  82. package/src/core/db/flatten-helper.js +1 -1
  83. package/src/core/db/query-builder-error.js +1 -1
  84. package/src/core/db/query-builder.js +1 -1
  85. package/src/core/db/relation-helper.js +1 -1
  86. package/src/core/handlers/delete_handler.js +1 -1
  87. package/src/core/handlers/insert_handler.js +1 -1
  88. package/src/core/handlers/update_handler.js +1 -1
  89. package/src/core/models/base-model.js +1 -1
  90. package/src/core/utils/cache-manager.js +1 -1
  91. package/src/core/utils/component-engine.js +1 -1
  92. package/src/core/utils/context-builder.js +1 -1
  93. package/src/core/utils/datetime-formatter.js +1 -1
  94. package/src/core/utils/datetime-parser.js +1 -1
  95. package/src/core/utils/db.js +1 -1
  96. package/src/core/utils/logger.js +1 -1
  97. package/src/core/utils/payload-loader.js +1 -1
  98. package/src/core/utils/security-checks.js +1 -1
  99. package/src/middleware/body-options.js +1 -1
  100. package/src/middleware/cors.js +1 -1
  101. package/src/middleware/idempotency.js +1 -1
  102. package/src/middleware/rate-limiter.js +1 -1
  103. package/src/middleware/request-logger.js +1 -1
  104. package/src/middleware/security-headers.js +1 -1
  105. package/src/models/base-model-mysql.js +1 -1
  106. package/src/models/base-model-oracle.js +1 -1
  107. package/src/models/base-model-sqlite.js +1 -1
  108. package/src/models/base-model.js +1 -1
  109. package/src/pro/caching/redis-client.js +1 -1
  110. package/src/pro/caching/redis-helper.js +1 -1
  111. package/src/pro/consumers/baseConsumer.js +1 -1
  112. package/src/pro/consumers/declarativeMapper.js +1 -1
  113. package/src/pro/consumers/handlers/apiHandler.js +1 -1
  114. package/src/pro/consumers/handlers/consoleHandler.js +1 -1
  115. package/src/pro/consumers/handlers/databaseHandler.js +1 -1
  116. package/src/pro/consumers/handlers/index.js +1 -1
  117. package/src/pro/consumers/handlers/kafkaHandler.js +1 -1
  118. package/src/pro/consumers/index.js +1 -1
  119. package/src/pro/consumers/messageTransformer.js +1 -1
  120. package/src/pro/consumers/validator.js +1 -1
  121. package/src/pro/database/base-model-mysql.js +1 -1
  122. package/src/pro/database/base-model-oracle.js +1 -1
  123. package/src/pro/database/base-model-sqlite.js +1 -1
  124. package/src/pro/database/db-mysql.js +1 -1
  125. package/src/pro/database/db-oracle.js +1 -1
  126. package/src/pro/database/db-sqlite.js +1 -1
  127. package/src/pro/excel/excel-generator.js +1 -1
  128. package/src/pro/excel/excel-parser.js +1 -1
  129. package/src/pro/excel/export-service.js +1 -1
  130. package/src/pro/excel/export_handler.js +1 -1
  131. package/src/pro/excel/import-service.js +1 -1
  132. package/src/pro/excel/import-validator.js +1 -1
  133. package/src/pro/excel/import_handler.js +1 -1
  134. package/src/pro/excel/upsert-builder.js +1 -1
  135. package/src/pro/idgen/idgen-routes.js +1 -1
  136. package/src/pro/integrations/lookup-resolver.js +1 -1
  137. package/src/pro/integrations/upload-handler-v2.js +1 -1
  138. package/src/pro/integrations/upload-handler.js +1 -1
  139. package/src/pro/integrations/webhook.js +1 -1
  140. package/src/pro/locking/lock-routes.js +1 -1
  141. package/src/pro/locking/resource-lock-manager.js +1 -1
  142. package/src/pro/messaging/kafkaConsumerService.js +1 -1
  143. package/src/pro/messaging/kafkaService.js +1 -1
  144. package/src/pro/messaging/messagehubService.js +1 -1
  145. package/src/pro/messaging/rabbitmqService.js +1 -1
  146. package/src/pro/scheduler/job-manager.js +1 -1
  147. package/src/pro/scheduler/job-routes.js +1 -1
  148. package/src/pro/scheduler/job-validator.js +1 -1
  149. package/src/pro/storage/base-storage-provider.js +1 -1
  150. package/src/pro/storage/file-metadata-helper.js +1 -1
  151. package/src/pro/storage/index.js +1 -1
  152. package/src/pro/storage/local-storage-provider.js +1 -1
  153. package/src/pro/storage/s3-storage-provider.js +1 -1
  154. package/src/pro/storage/upload-cleanup-job.js +1 -1
  155. package/src/pro/storage/upload-cleanup-scheduler.js +1 -1
  156. package/src/pro/storage/upload-pending-tracker.js +1 -1
  157. package/src/pro/websocket/broadcast-helper.js +1 -1
  158. package/src/pro/websocket/index.js +1 -1
  159. package/src/pro/websocket/livesync-server.js +1 -1
  160. package/src/pro/websocket/ws-broadcaster.js +1 -1
  161. package/src/services/export-service.js +1 -1
  162. package/src/services/import-service.js +1 -1
  163. package/src/services/kafkaConsumerService.js +1 -1
  164. package/src/services/kafkaService.js +1 -1
  165. package/src/services/messagehubService.js +1 -1
  166. package/src/services/rabbitmqService.js +1 -1
  167. package/src/utils/cache-invalidation-registry.js +1 -1
  168. package/src/utils/cache-manager.js +1 -1
  169. package/src/utils/component-engine.js +1 -1
  170. package/src/utils/config-extractor.js +1 -1
  171. package/src/utils/consumerLogger.js +1 -1
  172. package/src/utils/context-builder.js +1 -1
  173. package/src/utils/dashboard-helpers.js +1 -1
  174. package/src/utils/dateHelper.js +1 -1
  175. package/src/utils/datetime-formatter.js +1 -1
  176. package/src/utils/datetime-parser.js +1 -1
  177. package/src/utils/db-bootstrap.js +1 -1
  178. package/src/utils/db-mysql.js +1 -1
  179. package/src/utils/db-oracle.js +1 -1
  180. package/src/utils/db-sqlite.js +1 -1
  181. package/src/utils/db.js +1 -1
  182. package/src/utils/demo-generator.js +1 -1
  183. package/src/utils/excel-generator.js +1 -1
  184. package/src/utils/excel-parser.js +1 -1
  185. package/src/utils/file-watcher.js +1 -1
  186. package/src/utils/id-generator.js +1 -1
  187. package/src/utils/idempotency-manager.js +1 -1
  188. package/src/utils/import-validator.js +1 -1
  189. package/src/utils/license-client.js +1 -1
  190. package/src/utils/lock-manager.js +1 -1
  191. package/src/utils/logger.js +1 -1
  192. package/src/utils/lookup-resolver.js +1 -1
  193. package/src/utils/payload-loader.js +1 -1
  194. package/src/utils/processor-response.js +1 -1
  195. package/src/utils/rabbitmq.js +1 -1
  196. package/src/utils/redis-client.js +1 -1
  197. package/src/utils/redis-helper.js +1 -1
  198. package/src/utils/request-scope.js +1 -1
  199. package/src/utils/security-checks.js +1 -1
  200. package/src/utils/service-resolver.js +1 -1
  201. package/src/utils/shutdown-coordinator.js +1 -1
  202. package/src/utils/trusted-keys.js +1 -1
  203. package/src/utils/upload-handler.js +1 -1
  204. package/src/utils/upsert-builder.js +1 -1
  205. package/src/utils/workflow-hook-executor.js +1 -1
  206. package/generators/metadata/global.json +0 -58
  207. package/generators/metadata/test-mysql-workbench.json +0 -118
  208. package/generators/metadata/test-mysql.json +0 -56
  209. package/generators/metadata/test-oracle-workbench.json +0 -118
  210. package/generators/metadata/test-oracle.json +0 -56
  211. package/generators/metadata/test-pg-workbench.json +0 -118
  212. package/generators/metadata/test-pg.json +0 -56
  213. package/generators/scripts/obfuscate-source.js +0 -356
  214. package/generators/scripts/validate-catalog.js +0 -430
  215. package/generators/scripts/validate-dbschema-catalog.js +0 -708
  216. package/generators/tests/baseline/mysql/mini_inventory_item/src/models/mini-inventory/item.js +0 -944
  217. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  218. package/generators/tests/baseline/mysql/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  219. package/generators/tests/baseline/oracle/mini_inventory_item/src/models/mini-inventory/item.js +0 -1002
  220. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory/item.js +0 -740
  221. package/generators/tests/baseline/oracle/mini_inventory_item/src/modules/mini-inventory.js +0 -336
  222. package/generators/tests/baseline/postgres/mini_inventory_item/src/models/mini-inventory/item.js +0 -1333
  223. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory/item.js +0 -1173
  224. package/generators/tests/baseline/postgres/mini_inventory_item/src/modules/mini-inventory.js +0 -496
  225. package/generators/tests/fixtures/payloads/custom-sensitive.json +0 -27
  226. package/generators/tests/fixtures/payloads/dynamic-search-optout.json +0 -23
  227. package/generators/tests/fixtures/payloads/login-with-password.json +0 -22
  228. package/generators/tests/fixtures/payloads/order-process.json +0 -52
  229. package/generators/tests/fixtures/payloads/with-inline-sql.json +0 -26
  230. package/generators/tests/integration-tahap4b/README.md +0 -145
  231. package/generators/tests/integration-tahap4b/run-concurrent.js +0 -77
  232. package/generators/tests/integration-tahap4b/seed.sql +0 -53
  233. package/generators/tests/integration-tahap4b/verify.sql +0 -110
  234. package/generators/tests/unit/cli/create-dashboard.test.js +0 -505
  235. package/generators/tests/unit/cli/create-processor.test.js +0 -319
  236. package/generators/tests/unit/cli/dispatch-dashboard.test.js +0 -149
  237. package/generators/tests/unit/lib/dashboard-generator.test.js +0 -895
  238. package/generators/tests/unit/lib/dashboard-validator.test.js +0 -354
  239. package/generators/tests/unit/lib/dbschema-kit/apply-executor.test.js +0 -437
  240. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-introspect.test.js +0 -393
  241. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-generate-ddl.test.js +0 -104
  242. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-init.test.js +0 -119
  243. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-list.test.js +0 -48
  244. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-migrate.test.js +0 -175
  245. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-kit-validate.test.js +0 -102
  246. package/generators/tests/unit/lib/dbschema-kit/cli/dbschema-models.test.js +0 -43
  247. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/all-schemas-listing.js +0 -84
  248. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/connection-error.js +0 -13
  249. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/empty.js +0 -12
  250. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/multi-schema.js +0 -124
  251. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/single-schema-inventory.js +0 -64
  252. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/introspect-stubs/two-tables.js +0 -66
  253. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/connection-error.js +0 -9
  254. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/partial.js +0 -29
  255. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/rollback.js +0 -26
  256. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/migrate-stubs/success.js +0 -43
  257. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/audit/events.js +0 -18
  258. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/inventory/products.js +0 -9
  259. package/generators/tests/unit/lib/dbschema-kit/cli/fixtures/multi-schema/users.js +0 -8
  260. package/generators/tests/unit/lib/dbschema-kit/connection.test.js +0 -112
  261. package/generators/tests/unit/lib/dbschema-kit/ddl-generator.test.js +0 -205
  262. package/generators/tests/unit/lib/dbschema-kit/define-model.test.js +0 -56
  263. package/generators/tests/unit/lib/dbschema-kit/dialect/index.test.js +0 -46
  264. package/generators/tests/unit/lib/dbschema-kit/dialect/mysql.test.js +0 -126
  265. package/generators/tests/unit/lib/dbschema-kit/dialect/oracle.test.js +0 -126
  266. package/generators/tests/unit/lib/dbschema-kit/dialect/postgres.test.js +0 -131
  267. package/generators/tests/unit/lib/dbschema-kit/dialect/sqlite.test.js +0 -126
  268. package/generators/tests/unit/lib/dbschema-kit/driver-loader.test.js +0 -93
  269. package/generators/tests/unit/lib/dbschema-kit/emitters/create-index.test.js +0 -173
  270. package/generators/tests/unit/lib/dbschema-kit/emitters/create-table.test.js +0 -376
  271. package/generators/tests/unit/lib/dbschema-kit/emitters/drop-table.test.js +0 -78
  272. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/invalid-dialect.env +0 -6
  273. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-dialect.env +0 -5
  274. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/missing-host.env +0 -5
  275. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/oracle-valid.env +0 -6
  276. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/postgres-valid.env +0 -7
  277. package/generators/tests/unit/lib/dbschema-kit/fixtures/connection/sqlite-valid.env +0 -2
  278. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/category.js +0 -11
  279. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/item_product.js +0 -11
  280. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound.js +0 -24
  281. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/stock_inbound_item.js +0 -28
  282. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/supplier.js +0 -9
  283. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory/warehouse.js +0 -9
  284. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-invalid/orphan.js +0 -17
  285. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/category.js +0 -11
  286. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/item_product.js +0 -11
  287. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/supplier.js +0 -9
  288. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/master/warehouse.js +0 -9
  289. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound.js +0 -24
  290. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/mini-inventory-multifolder/transactions/stock_inbound_item.js +0 -28
  291. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/audit/events.js +0 -18
  292. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/inventory/products.js +0 -9
  293. package/generators/tests/unit/lib/dbschema-kit/fixtures/integration/multi-schema/public/users.js +0 -9
  294. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/extra/category.js +0 -8
  295. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-subfolder/master/category.js +0 -8
  296. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/bar.js +0 -8
  297. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/duplicate-tablename/foo.js +0 -8
  298. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/empty-folder/README.md +0 -1
  299. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-export/plain.js +0 -3
  300. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/invalid-schema/bad.js +0 -6
  301. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/legacy-pattern/legacy.js +0 -12
  302. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/audit/products.js +0 -9
  303. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-distinct/inventory/products.js +0 -9
  304. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/a/products.js +0 -8
  305. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/multi-schema-duplicate/b/products.js +0 -8
  306. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/nested-deep/a/b/c/deep_table.js +0 -8
  307. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/.hidden/ignored.js +0 -7
  308. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/category.js +0 -8
  309. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/master/supplier.js +0 -8
  310. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound.js +0 -8
  311. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/recursive-multi-folder/transactions/stock_inbound_item.js +0 -8
  312. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/category.js +0 -8
  313. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-multiple/item_product.js +0 -9
  314. package/generators/tests/unit/lib/dbschema-kit/fixtures/loader/valid-single/category.js +0 -8
  315. package/generators/tests/unit/lib/dbschema-kit/integration.test.js +0 -217
  316. package/generators/tests/unit/lib/dbschema-kit/introspect-mapper.test.js +0 -403
  317. package/generators/tests/unit/lib/dbschema-kit/ir-builder.test.js +0 -390
  318. package/generators/tests/unit/lib/dbschema-kit/loader.test.js +0 -128
  319. package/generators/tests/unit/lib/dbschema-kit/naming.test.js +0 -170
  320. package/generators/tests/unit/lib/dbschema-kit/parser/shorthand-parser.test.js +0 -237
  321. package/generators/tests/unit/lib/dbschema-kit/schema-printer.test.js +0 -251
  322. package/generators/tests/unit/lib/dbschema-kit/statement-modifier.test.js +0 -105
  323. package/generators/tests/unit/lib/dbschema-kit/statement-splitter.test.js +0 -165
  324. package/generators/tests/unit/lib/dbschema-kit/topological-sort.test.js +0 -135
  325. package/generators/tests/unit/lib/dbschema-kit/validator/check-compatibility-validator.test.js +0 -373
  326. package/generators/tests/unit/lib/dbschema-kit/validator/circular-relation-validator.test.js +0 -454
  327. package/generators/tests/unit/lib/dbschema-kit/validator/cross-model-validator.test.js +0 -512
  328. package/generators/tests/unit/lib/dbschema-kit/validator/enhanced-validate-integration.test.js +0 -390
  329. package/generators/tests/unit/lib/dbschema-kit/validator/naming-convention-validator.test.js +0 -306
  330. package/generators/tests/unit/lib/dbschema-kit/validator/schema-validator.test.js +0 -443
  331. package/generators/tests/unit/lib/dbschema-kit/validator/type-compatibility-validator.test.js +0 -440
  332. package/generators/tests/unit/lib/dbschema-kit/validator/validator-reporter.test.js +0 -172
  333. package/generators/tests/unit/lib/metadata-manager-dashboard.test.js +0 -256
  334. package/generators/tests/unit/lib/payload-validator-fieldpolicy.test.js +0 -240
  335. package/generators/tests/unit/lib/processor-validation-generator.test.js +0 -300
  336. package/generators/tests/unit/lib/sensitive-field-masker.test.js +0 -170
  337. package/generators/tests/unit/lib/sql-table-extractor.test.js +0 -119
  338. package/scripts/generate-integrity-manifest.js +0 -124
  339. package/scripts/snapshot-cli-contracts.js +0 -194
  340. package/scripts/verify-publish.js +0 -56
@@ -1,489 +1 @@
1
- 'use strict';
2
-
3
- /**
4
- * Authoritative source for dbschema-catalog content.
5
- * Used by:
6
- * - cli/dbschema-catalog.js (CLI introspection command)
7
- * - (future) MCP server tool for dbschema-kit grounding
8
- *
9
- * SINGLE SOURCE OF TRUTH: Modify only this file when adding/changing
10
- * dbschema-kit defineModel API spec. Keep in sync with:
11
- * - lib/dbschema-kit/define-model.js
12
- * - lib/dbschema-kit/parser/shorthand-parser.js
13
- * - lib/dbschema-kit/validator/schema-validator.js
14
- * - lib/dbschema-kit/validator/cross-model-validator.js
15
- * - lib/dbschema-kit/ir-builder.js
16
- * - lib/dbschema-kit/naming.js
17
- *
18
- * Reference: docs/schema-definition.md (single source of truth, human-readable)
19
- *
20
- * @module lib/templates/dbschema-catalog
21
- */
22
-
23
- const SCHEMA_VERSION = '1.0';
24
- const SOURCE = 'dbschema-catalog';
25
- const DOCUMENTATION_URL = 'https://restforge.dev/docs/cli/schema-definition';
26
-
27
- // ============================================================================
28
- // DEFINE MODEL OPTIONS
29
- // ============================================================================
30
-
31
- // Note: defineModel signature is `defineModel(tableName, options)`.
32
- // `tableName` is a positional first argument (snake_case), not a property of `options`.
33
- // Schema files use factory pattern:
34
- // module.exports = ({ defineModel }) => defineModel('table_name', { fields: { ... } });
35
- // Auto-derive from filename happens at the CLI loader level, not in defineModel itself.
36
- const DEFINE_MODEL_OPTIONS = [
37
- {
38
- name: 'schema',
39
- required: false,
40
- type: 'string|null',
41
- description: 'Database schema namespace (multi-schema database).',
42
- notes: 'null or empty string means default schema.'
43
- },
44
- {
45
- name: 'fields',
46
- required: true,
47
- type: 'object',
48
- description: 'Object of field definitions in shorthand string format.',
49
- example: '{ id: "string:36 pk", name: "string:255 notnull" }'
50
- },
51
- {
52
- name: 'primaryKey',
53
- required: false,
54
- type: 'string|array',
55
- description: 'Override primary key. Single field name or composite array.',
56
- notes: 'Auto-detected from field shorthand "pk" when not specified.'
57
- },
58
- {
59
- name: 'relations',
60
- required: false,
61
- type: 'object',
62
- description: 'Inter-table relations (belongsTo, hasOne, hasMany).',
63
- example: '{ category: { type: "belongsTo", references: "category(id)" } }'
64
- },
65
- {
66
- name: 'indexes',
67
- required: false,
68
- type: 'array',
69
- description: 'Non-unique indexes. Each entry is array of column names or object { name, columns }.',
70
- example: '[["status", "created_at"]]'
71
- },
72
- {
73
- name: 'uniques',
74
- required: false,
75
- type: 'array',
76
- description: 'Unique constraints (single or composite).',
77
- example: '[["category_code"], ["tenant_id", "category_code"]]'
78
- },
79
- {
80
- name: 'checks',
81
- required: false,
82
- type: 'array',
83
- description: 'CHECK constraints. Each entry uses operator-as-key shape: { name?, field, <operator>: <value> } where <operator> is one of checkOperations (in, eq, neq, gt, gte, lt, lte). The internal IR shape after ir-builder normalization is { name?, field, op, value }, but that is NOT the user input format.',
84
- example: '[{ field: "status", in: ["active", "inactive"] }, { field: "qty", gte: 0 }]'
85
- }
86
- ];
87
-
88
- // ============================================================================
89
- // FIELD TYPES (10 entries)
90
- // Source: lib/dbschema-kit/parser/shorthand-parser.js (VALID_TYPES)
91
- // ============================================================================
92
-
93
- const FIELD_TYPES = [
94
- {
95
- name: 'string',
96
- description: 'Variable-length text. Length modifier required.',
97
- requiresModifier: true,
98
- modifierFormat: 'string:<length>',
99
- example: 'string:255',
100
- notes: 'Explicit length required for cross-dialect portability.'
101
- },
102
- {
103
- name: 'text',
104
- description: 'Long-form text without length limit (TEXT/CLOB).',
105
- requiresModifier: false,
106
- example: 'text'
107
- },
108
- {
109
- name: 'integer',
110
- description: '32-bit signed integer (INT/INTEGER).',
111
- requiresModifier: false,
112
- example: 'integer'
113
- },
114
- {
115
- name: 'bigint',
116
- description: '64-bit signed integer (BIGINT).',
117
- requiresModifier: false,
118
- example: 'bigint'
119
- },
120
- {
121
- name: 'decimal',
122
- description: 'Fixed-point decimal. Precision and scale required.',
123
- requiresModifier: true,
124
- modifierFormat: 'decimal:<precision>,<scale>',
125
- example: 'decimal:15,2',
126
- notes: 'Precision and scale required for cross-dialect portability.'
127
- },
128
- {
129
- name: 'boolean',
130
- description: 'Boolean value (native BOOLEAN on PostgreSQL, VARCHAR on others).',
131
- requiresModifier: false,
132
- example: 'boolean'
133
- },
134
- {
135
- name: 'date',
136
- description: 'Date only (no time component).',
137
- requiresModifier: false,
138
- example: 'date'
139
- },
140
- {
141
- name: 'timestamp',
142
- description: 'Date and time (TIMESTAMP).',
143
- requiresModifier: false,
144
- example: 'timestamp',
145
- notes: 'Default timezone behavior is dialect-specific.'
146
- },
147
- {
148
- name: 'uuid',
149
- description: 'UUID. Native UUID on PostgreSQL, VARCHAR(36) on others.',
150
- requiresModifier: false,
151
- example: 'uuid'
152
- },
153
- {
154
- name: 'json',
155
- description: 'JSON column (JSONB on PostgreSQL, JSON on MySQL, CLOB on Oracle).',
156
- requiresModifier: false,
157
- example: 'json'
158
- }
159
- ];
160
-
161
- // ============================================================================
162
- // CONSTRAINTS (shorthand)
163
- // Source: lib/dbschema-kit/parser/shorthand-parser.js
164
- // STANDALONE_CONSTRAINTS, VALUE_CONSTRAINTS
165
- // ============================================================================
166
-
167
- const CONSTRAINTS = [
168
- {
169
- name: 'pk',
170
- kind: 'standalone',
171
- description: 'Marks field as primary key.',
172
- example: 'string:36 pk'
173
- },
174
- {
175
- name: 'notnull',
176
- kind: 'standalone',
177
- description: 'NOT NULL constraint.',
178
- example: 'string:255 notnull'
179
- },
180
- {
181
- name: 'unique',
182
- kind: 'standalone',
183
- description: 'Single-column unique constraint.',
184
- example: 'string:32 unique'
185
- },
186
- {
187
- name: 'index',
188
- kind: 'standalone',
189
- description: 'Single-column non-unique index.',
190
- example: 'string:64 index'
191
- },
192
- {
193
- name: 'autoUpdate',
194
- kind: 'standalone',
195
- description: 'Marker for audit timestamp columns. RESTForge generator injects this column = <native_now> on every UPDATE statement.',
196
- example: 'timestamp autoUpdate',
197
- notes: 'Only valid for type \'timestamp\' or \'date\'. Cannot coexist with \'default:\' constraint. Pre-processed in ir-builder before parser.'
198
- },
199
- {
200
- name: 'default',
201
- kind: 'value',
202
- description: 'Default value. Single-quoted for strings, raw for numeric/boolean, bare identifier for SQL constants, identifier() for native function calls.',
203
- valueFormat: "default:<literal> | default:'<string>' | default:<constant> | default:<function>()",
204
- example: 'boolean default:true'
205
- },
206
- {
207
- name: 'fk',
208
- kind: 'value',
209
- description: 'Foreign key reference. Auto-generates a belongsTo relation entry.',
210
- valueFormat: 'fk:<table>.<column>',
211
- example: 'string:36 fk:category.id',
212
- notes: 'Cannot coexist with explicit relation entry referencing the same field.'
213
- }
214
- ];
215
-
216
- // ============================================================================
217
- // RELATION TYPES
218
- // Source: lib/dbschema-kit/validator/schema-validator.js (VALID_RELATION_TYPES)
219
- // ============================================================================
220
-
221
- const RELATION_TYPES = [
222
- {
223
- name: 'belongsTo',
224
- description: 'Many-to-one. This table holds the FK column referencing the parent table.',
225
- requiredFields: ['type', 'localKey', 'references'],
226
- optionalFields: ['target', 'onDelete', 'onUpdate'],
227
- example: '{ type: "belongsTo", localKey: "category_id", references: "category_id", onDelete: "restrict" }',
228
- notes: '`references` is the bare column name in the target table. Target table is auto-derived from the relation key name, or override with `target`.'
229
- },
230
- {
231
- name: 'hasOne',
232
- description: 'One-to-one (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
233
- requiredFields: ['type', 'localKey', 'references'],
234
- optionalFields: ['target', 'onDelete', 'onUpdate'],
235
- example: '{ type: "hasOne", target: "profile", localKey: "user_id", references: "user_id" }'
236
- },
237
- {
238
- name: 'hasMany',
239
- description: 'One-to-many (inverse of belongsTo). Optional inverse declaration on the parent side; does not affect DDL.',
240
- requiredFields: ['type', 'localKey', 'references'],
241
- optionalFields: ['target', 'onDelete', 'onUpdate'],
242
- example: '{ type: "hasMany", target: "order_item", localKey: "order_id", references: "order_id" }'
243
- }
244
- ];
245
-
246
- // ============================================================================
247
- // REFERENTIAL ACTIONS (onDelete / onUpdate)
248
- // Source: lib/dbschema-kit/validator/schema-validator.js (VALID_REFERENTIAL_ACTIONS)
249
- // ============================================================================
250
-
251
- const REFERENTIAL_ACTIONS = [
252
- {
253
- name: 'cascade',
254
- description: 'Cascade delete/update to child rows.',
255
- appliesTo: ['onDelete', 'onUpdate']
256
- },
257
- {
258
- name: 'restrict',
259
- description: 'Reject delete/update when child rows exist.',
260
- appliesTo: ['onDelete', 'onUpdate']
261
- },
262
- {
263
- name: 'setNull',
264
- description: 'Set FK column to NULL on child rows.',
265
- appliesTo: ['onDelete', 'onUpdate'],
266
- notes: 'FK field must be nullable.'
267
- },
268
- {
269
- name: 'noAction',
270
- description: 'Defer constraint check (semantically similar to restrict on most dialects).',
271
- appliesTo: ['onDelete', 'onUpdate']
272
- }
273
- ];
274
-
275
- // ============================================================================
276
- // CHECK OPERATIONS
277
- // Source: lib/dbschema-kit/ir-builder.js (VALID_CHECK_OPS)
278
- // ============================================================================
279
-
280
- const CHECK_OPERATIONS = [
281
- {
282
- name: 'in',
283
- description: 'Value must be one of a list.',
284
- valueType: 'array',
285
- example: '{ field: "status", in: ["active", "inactive"] }'
286
- },
287
- {
288
- name: 'eq',
289
- description: 'Equal to.',
290
- valueType: 'scalar',
291
- example: '{ field: "type", eq: "user" }'
292
- },
293
- {
294
- name: 'neq',
295
- description: 'Not equal to.',
296
- valueType: 'scalar',
297
- example: '{ field: "type", neq: "system" }'
298
- },
299
- {
300
- name: 'gt',
301
- description: 'Greater than.',
302
- valueType: 'numeric',
303
- example: '{ field: "qty", gt: 0 }'
304
- },
305
- {
306
- name: 'gte',
307
- description: 'Greater than or equal to.',
308
- valueType: 'numeric',
309
- example: '{ field: "qty", gte: 0 }'
310
- },
311
- {
312
- name: 'lt',
313
- description: 'Less than.',
314
- valueType: 'numeric',
315
- example: '{ field: "discount", lt: 100 }'
316
- },
317
- {
318
- name: 'lte',
319
- description: 'Less than or equal to.',
320
- valueType: 'numeric',
321
- example: '{ field: "discount", lte: 100 }'
322
- }
323
- ];
324
-
325
- // ============================================================================
326
- // AUDIT COLUMNS CONVENTION
327
- // Cross-reference: lib/templates/field-validation-catalog.js (AUDIT_COLUMNS)
328
- // ============================================================================
329
-
330
- const AUDIT_COLUMNS = {
331
- description: 'Standard 4-column audit convention for tables managed by RESTForge. The same convention is documented in field-validation:catalog (auditColumns section) for the RDF/backend layer. SDF and RDF stay aligned when both declare these 4 columns.',
332
- columns: [
333
- {
334
- name: 'created_at',
335
- shorthand: 'timestamp default:now()',
336
- nullable: true,
337
- purpose: 'Record creation timestamp. Auto-set on INSERT via DEFAULT now(). Native function translates per dialect (postgres: CURRENT_TIMESTAMP, mysql: NOW(), oracle: SYSTIMESTAMP, sqlite: CURRENT_TIMESTAMP).'
338
- },
339
- {
340
- name: 'created_by',
341
- shorthand: 'string:100',
342
- nullable: true,
343
- purpose: 'User identifier (username, user_id, or composite token) of the record creator. Set by application layer on INSERT, not by database default.'
344
- },
345
- {
346
- name: 'updated_at',
347
- shorthand: 'timestamp autoUpdate',
348
- nullable: true,
349
- purpose: 'Last modification timestamp. autoUpdate is a marker constraint — the RESTForge generator injects updated_at = <native_now> into every UPDATE statement. Initial INSERT value is the application layer responsibility.'
350
- },
351
- {
352
- name: 'updated_by',
353
- shorthand: 'string:100',
354
- nullable: true,
355
- purpose: 'User identifier of the last modifier. Set by application layer on UPDATE, not by database default.'
356
- }
357
- ],
358
- convention: {
359
- emitInSkeleton: 'Yes — dbschema:init emits all 4 columns by default. Tables that do not need audit (lookup tables, system tables) can manually remove these fields from the generated skeleton.',
360
- nullablePolicy: 'All 4 columns are nullable. The created_by/updated_by columns may be empty for rows inserted by system seeds, migrations, or batch imports that do not have a user context.',
361
- relationToRdf: 'The RDF generator (codegen_create_endpoint) assumes these 4 columns exist when the payload.auditColumns key is absent. See field-validation:catalog auditColumns for the RDF-side behavior. Drift between SDF (missing audit columns) and RDF (assumes audit columns) causes runtime errors when the generated endpoint tries to write created_by/updated_by to a non-existent column.'
362
- }
363
- };
364
-
365
- // ============================================================================
366
- // SHORTHAND SYNTAX
367
- // Source: lib/dbschema-kit/parser/shorthand-parser.js
368
- // ============================================================================
369
-
370
- const SHORTHAND_SYNTAX = {
371
- format: '<type>[:<modifier>] [<constraint>[:<value>]]...',
372
- description: 'String shorthand for field definition. Type required at start, followed by optional modifier and space-separated constraints.',
373
- rules: [
374
- 'Type is mandatory at the beginning and must be one of fieldTypes.',
375
- 'Modifier is mandatory for type "string" (length) and "decimal" (precision,scale).',
376
- 'Standalone constraints (pk, notnull, unique, index, autoUpdate) take no value. autoUpdate is pre-processed in ir-builder before parser tokenization.',
377
- 'Value constraints (default, fk) require constraint:value format.',
378
- 'Default value format depends on type: raw for boolean (default:true), raw for integer (default:0), single-quoted for string (default:\'value\'), bare identifier for SQL constants (default:current_date), identifier() for native function calls (default:now()).',
379
- 'Foreign key uses dot notation: fk:<table>.<column> (e.g., fk:category.id). The parser rejects parentheses syntax.'
380
- ],
381
- examples: [
382
- { input: 'string:36 pk', meaning: 'VARCHAR(36) PRIMARY KEY' },
383
- { input: 'string:255 notnull', meaning: 'VARCHAR(255) NOT NULL' },
384
- { input: 'decimal:15,2 notnull default:0', meaning: 'DECIMAL(15,2) NOT NULL DEFAULT 0' },
385
- { input: 'boolean default:true', meaning: 'BOOLEAN DEFAULT TRUE' },
386
- { input: "string:100 default:'pending'", meaning: "VARCHAR(100) DEFAULT 'pending'" },
387
- { input: 'timestamp default:now()', meaning: 'TIMESTAMP DEFAULT <native_now per dialect>' },
388
- { input: 'timestamp autoUpdate', meaning: 'TIMESTAMP (generator injects = <native_now> on UPDATE)' },
389
- { input: 'string:36 fk:category.id', meaning: 'VARCHAR(36) with FK to category(id), auto belongsTo relation' },
390
- { input: 'string:64 index', meaning: 'VARCHAR(64) with single-column index' }
391
- ]
392
- };
393
-
394
- // ============================================================================
395
- // NAMING RULES
396
- // Source: lib/dbschema-kit/naming.js, validator/schema-validator.js
397
- // ============================================================================
398
-
399
- const NAMING_RULES = {
400
- tableName: {
401
- format: 'snake_case',
402
- description: 'Table name must be lowercase, digits, and underscores only.'
403
- },
404
- fieldName: {
405
- format: 'snake_case',
406
- description: 'Column name must be snake_case.'
407
- },
408
- constraintName: {
409
- format: '<prefix>_<table>_<suffix>',
410
- defaultMaxLength: 30,
411
- fallbackStrategy: 'MD5 hash 8-character suffix when name exceeds maxLength',
412
- description: 'Constraint names auto-generated with type-specific prefix (pk, fk, idx, uq, ck) and dialect-specific max length.'
413
- },
414
- compositeShortName: {
415
- description: 'For composite indexes/uniques, name is derived by joining columns with underscore and truncating when needed.'
416
- }
417
- };
418
-
419
- // ============================================================================
420
- // DIALECT SUPPORT
421
- // Source: lib/dbschema-kit/dialect/{postgres,mysql,oracle,sqlite}.js
422
- // ============================================================================
423
-
424
- const DIALECT_SUPPORT = [
425
- {
426
- name: 'postgres',
427
- driver: 'pg',
428
- booleanStorage: 'native BOOLEAN'
429
- },
430
- {
431
- name: 'mysql',
432
- driver: 'mysql2',
433
- booleanStorage: 'VARCHAR (literal "true"/"false")'
434
- },
435
- {
436
- name: 'oracle',
437
- driver: 'oracledb',
438
- booleanStorage: 'VARCHAR2 with CHECK constraint'
439
- },
440
- {
441
- name: 'sqlite',
442
- driver: 'better-sqlite3',
443
- booleanStorage: 'TEXT'
444
- }
445
- ];
446
-
447
- // ============================================================================
448
- // EXPORT
449
- // ============================================================================
450
-
451
- const DBSCHEMA_CATALOG = {
452
- schemaVersion: SCHEMA_VERSION,
453
- source: SOURCE,
454
- summary: {
455
- totalDefineModelOptions: DEFINE_MODEL_OPTIONS.length,
456
- totalFieldTypes: FIELD_TYPES.length,
457
- totalConstraints: CONSTRAINTS.length,
458
- totalRelationTypes: RELATION_TYPES.length,
459
- totalReferentialActions: REFERENTIAL_ACTIONS.length,
460
- totalCheckOperations: CHECK_OPERATIONS.length,
461
- totalAuditColumns: AUDIT_COLUMNS.columns.length,
462
- totalDialects: DIALECT_SUPPORT.length
463
- },
464
- defineModelOptions: DEFINE_MODEL_OPTIONS,
465
- fieldTypes: FIELD_TYPES,
466
- constraints: CONSTRAINTS,
467
- relationTypes: RELATION_TYPES,
468
- referentialActions: REFERENTIAL_ACTIONS,
469
- checkOperations: CHECK_OPERATIONS,
470
- auditColumns: AUDIT_COLUMNS,
471
- shorthandSyntax: SHORTHAND_SYNTAX,
472
- namingRules: NAMING_RULES,
473
- dialectSupport: DIALECT_SUPPORT,
474
- documentationUrl: DOCUMENTATION_URL
475
- };
476
-
477
- module.exports = {
478
- DBSCHEMA_CATALOG,
479
- DEFINE_MODEL_OPTIONS,
480
- FIELD_TYPES,
481
- CONSTRAINTS,
482
- RELATION_TYPES,
483
- REFERENTIAL_ACTIONS,
484
- CHECK_OPERATIONS,
485
- AUDIT_COLUMNS,
486
- SHORTHAND_SYNTAX,
487
- NAMING_RULES,
488
- DIALECT_SUPPORT
489
- };
1
+ 'use strict';const a0_0x590179=a0_0x2390;(function(_0x5c0dda,_0x3533bf){const _0x6a2875=a0_0x2390,_0x5129e3=_0x5c0dda();while(!![]){try{const _0x298d58=-parseInt(_0x6a2875(0x24a))/0x1+-parseInt(_0x6a2875(0x221))/0x2*(-parseInt(_0x6a2875(0x229))/0x3)+-parseInt(_0x6a2875(0x205))/0x4*(-parseInt(_0x6a2875(0x1f7))/0x5)+parseInt(_0x6a2875(0x1f6))/0x6+-parseInt(_0x6a2875(0x235))/0x7*(-parseInt(_0x6a2875(0x252))/0x8)+parseInt(_0x6a2875(0x238))/0x9*(-parseInt(_0x6a2875(0x224))/0xa)+-parseInt(_0x6a2875(0x1f1))/0xb;if(_0x298d58===_0x3533bf)break;else _0x5129e3['push'](_0x5129e3['shift']());}catch(_0x1aa027){_0x5129e3['push'](_0x5129e3['shift']());}}}(a0_0x1242,0x9a38f));const SCHEMA_VERSION='1.0',SOURCE='dbschema-catalog',DOCUMENTATION_URL=a0_0x590179(0x20a),DEFINE_MODEL_OPTIONS=[{'name':'schema','required':![],'type':a0_0x590179(0x236),'description':a0_0x590179(0x219),'notes':a0_0x590179(0x255)},{'name':a0_0x590179(0x21a),'required':!![],'type':a0_0x590179(0x20e),'description':a0_0x590179(0x22c),'example':a0_0x590179(0x258)},{'name':'primaryKey','required':![],'type':a0_0x590179(0x24e),'description':a0_0x590179(0x203),'notes':'Auto-detected\x20from\x20field\x20shorthand\x20\x22pk\x22\x20when\x20not\x20specified.'},{'name':'relations','required':![],'type':'object','description':'Inter-table\x20relations\x20(belongsTo,\x20hasOne,\x20hasMany).','example':'{\x20category:\x20{\x20type:\x20\x22belongsTo\x22,\x20references:\x20\x22category(id)\x22\x20}\x20}'},{'name':'indexes','required':![],'type':a0_0x590179(0x1fd),'description':a0_0x590179(0x23a),'example':'[[\x22status\x22,\x20\x22created_at\x22]]'},{'name':a0_0x590179(0x20b),'required':![],'type':'array','description':a0_0x590179(0x1ed),'example':'[[\x22category_code\x22],\x20[\x22tenant_id\x22,\x20\x22category_code\x22]]'},{'name':a0_0x590179(0x245),'required':![],'type':a0_0x590179(0x1fd),'description':'CHECK\x20constraints.\x20Each\x20entry\x20uses\x20operator-as-key\x20shape:\x20{\x20name?,\x20field,\x20<operator>:\x20<value>\x20}\x20where\x20<operator>\x20is\x20one\x20of\x20checkOperations\x20(in,\x20eq,\x20neq,\x20gt,\x20gte,\x20lt,\x20lte).\x20The\x20internal\x20IR\x20shape\x20after\x20ir-builder\x20normalization\x20is\x20{\x20name?,\x20field,\x20op,\x20value\x20},\x20but\x20that\x20is\x20NOT\x20the\x20user\x20input\x20format.','example':a0_0x590179(0x21f)}],FIELD_TYPES=[{'name':a0_0x590179(0x23b),'description':'Variable-length\x20text.\x20Length\x20modifier\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x1f8),'example':a0_0x590179(0x246),'notes':a0_0x590179(0x1f5)},{'name':'text','description':'Long-form\x20text\x20without\x20length\x20limit\x20(TEXT/CLOB).','requiresModifier':![],'example':'text'},{'name':a0_0x590179(0x23c),'description':a0_0x590179(0x1ef),'requiresModifier':![],'example':a0_0x590179(0x23c)},{'name':a0_0x590179(0x1ee),'description':a0_0x590179(0x216),'requiresModifier':![],'example':a0_0x590179(0x1ee)},{'name':'decimal','description':'Fixed-point\x20decimal.\x20Precision\x20and\x20scale\x20required.','requiresModifier':!![],'modifierFormat':a0_0x590179(0x22e),'example':'decimal:15,2','notes':a0_0x590179(0x202)},{'name':'boolean','description':a0_0x590179(0x247),'requiresModifier':![],'example':'boolean'},{'name':a0_0x590179(0x218),'description':a0_0x590179(0x230),'requiresModifier':![],'example':a0_0x590179(0x218)},{'name':a0_0x590179(0x212),'description':'Date\x20and\x20time\x20(TIMESTAMP).','requiresModifier':![],'example':'timestamp','notes':a0_0x590179(0x226)},{'name':'uuid','description':'UUID.\x20Native\x20UUID\x20on\x20PostgreSQL,\x20VARCHAR(36)\x20on\x20others.','requiresModifier':![],'example':'uuid'},{'name':a0_0x590179(0x22a),'description':a0_0x590179(0x1e0),'requiresModifier':![],'example':a0_0x590179(0x22a)}],CONSTRAINTS=[{'name':'pk','kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fb),'example':a0_0x590179(0x21e)},{'name':'notnull','kind':'standalone','description':'NOT\x20NULL\x20constraint.','example':'string:255\x20notnull'},{'name':'unique','kind':'standalone','description':'Single-column\x20unique\x20constraint.','example':'string:32\x20unique'},{'name':a0_0x590179(0x21c),'kind':a0_0x590179(0x23f),'description':a0_0x590179(0x1fa),'example':'string:64\x20index'},{'name':a0_0x590179(0x20d),'kind':'standalone','deprecated':!![],'description':'DEPRECATED:\x20This\x20modifier\x20no\x20longer\x20has\x20functional\x20effect\x20at\x20the\x20DDL\x20or\x20runtime\x20level.\x20Auto-update\x20for\x20updated_at\x20is\x20handled\x20by\x20the\x20RDF\x20layer\x20(auditColumns\x20convention\x20in\x20BaseModel\x20runtime)\x20based\x20on\x20field\x20naming\x20convention,\x20not\x20by\x20this\x20SDF\x20marker.\x20Existing\x20usage\x20is\x20preserved\x20for\x20backward\x20compatibility\x20but\x20should\x20be\x20removed\x20from\x20new\x20templates.','example':'timestamp','notes':'Engine\x20still\x20parses\x20this\x20token\x20(backward\x20compatibility),\x20but\x20DDL\x20output\x20is\x20identical\x20to\x20plain\x20\x27timestamp\x27.\x20Use\x20\x27timestamp\x27\x20alone.\x20The\x20actual\x20auto-update\x20behavior\x20is\x20documented\x20in\x20the\x20RDF\x20auditColumns\x20catalog\x20(field-validation:catalog).'},{'name':a0_0x590179(0x204),'kind':'value','description':a0_0x590179(0x23d),'valueFormat':'default:<literal>\x20|\x20default:\x27<string>\x27\x20|\x20default:<constant>\x20|\x20default:<function>()','example':a0_0x590179(0x231)},{'name':'fk','kind':a0_0x590179(0x215),'description':'Foreign\x20key\x20reference.\x20Auto-generates\x20a\x20belongsTo\x20relation\x20entry.','valueFormat':a0_0x590179(0x248),'example':'string:36\x20fk:category.id','notes':'Cannot\x20coexist\x20with\x20explicit\x20relation\x20entry\x20referencing\x20the\x20same\x20field.'}],RELATION_TYPES=[{'name':a0_0x590179(0x1f2),'description':'Many-to-one.\x20This\x20table\x20holds\x20the\x20FK\x20column\x20referencing\x20the\x20parent\x20table.','requiredFields':[a0_0x590179(0x209),'localKey','references'],'optionalFields':[a0_0x590179(0x23e),a0_0x590179(0x214),a0_0x590179(0x208)],'example':a0_0x590179(0x1f4),'notes':a0_0x590179(0x1e4)},{'name':'hasOne','description':'One-to-one\x20(inverse\x20of\x20belongsTo).\x20Optional\x20inverse\x20declaration\x20on\x20the\x20parent\x20side;\x20does\x20not\x20affect\x20DDL.','requiredFields':[a0_0x590179(0x209),a0_0x590179(0x241),a0_0x590179(0x249)],'optionalFields':['target','onDelete',a0_0x590179(0x208)],'example':'{\x20type:\x20\x22hasOne\x22,\x20target:\x20\x22profile\x22,\x20localKey:\x20\x22user_id\x22,\x20references:\x20\x22user_id\x22\x20}'},{'name':'hasMany','description':a0_0x590179(0x20f),'requiredFields':['type','localKey',a0_0x590179(0x249)],'optionalFields':[a0_0x590179(0x23e),'onDelete',a0_0x590179(0x208)],'example':a0_0x590179(0x228)}],REFERENTIAL_ACTIONS=[{'name':'cascade','description':a0_0x590179(0x257),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x1f9),'description':a0_0x590179(0x200),'appliesTo':['onDelete','onUpdate']},{'name':a0_0x590179(0x244),'description':a0_0x590179(0x1e2),'appliesTo':['onDelete','onUpdate'],'notes':'FK\x20field\x20must\x20be\x20nullable.'},{'name':a0_0x590179(0x1fc),'description':a0_0x590179(0x237),'appliesTo':[a0_0x590179(0x214),a0_0x590179(0x208)]}],CHECK_OPERATIONS=[{'name':'in','description':'Value\x20must\x20be\x20one\x20of\x20a\x20list.','valueType':'array','example':'{\x20field:\x20\x22status\x22,\x20in:\x20[\x22active\x22,\x20\x22inactive\x22]\x20}'},{'name':'eq','description':a0_0x590179(0x1e6),'valueType':'scalar','example':'{\x20field:\x20\x22type\x22,\x20eq:\x20\x22user\x22\x20}'},{'name':a0_0x590179(0x232),'description':a0_0x590179(0x256),'valueType':a0_0x590179(0x254),'example':a0_0x590179(0x227)},{'name':'gt','description':a0_0x590179(0x223),'valueType':'numeric','example':a0_0x590179(0x20c)},{'name':a0_0x590179(0x1e1),'description':'Greater\x20than\x20or\x20equal\x20to.','valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x21b)},{'name':'lt','description':a0_0x590179(0x22b),'valueType':'numeric','example':a0_0x590179(0x217)},{'name':a0_0x590179(0x1ea),'description':a0_0x590179(0x201),'valueType':a0_0x590179(0x24f),'example':a0_0x590179(0x242)}],AUDIT_COLUMNS={'description':a0_0x590179(0x21d),'columns':[{'name':a0_0x590179(0x22f),'shorthand':'timestamp\x20default:now()','nullable':!![],'purpose':a0_0x590179(0x239)},{'name':'created_by','shorthand':'string:100','nullable':!![],'purpose':'User\x20identifier\x20(username,\x20user_id,\x20or\x20composite\x20token)\x20of\x20the\x20record\x20creator.\x20Set\x20by\x20application\x20layer\x20on\x20INSERT,\x20not\x20by\x20database\x20default.'},{'name':'updated_at','shorthand':a0_0x590179(0x212),'nullable':!![],'purpose':a0_0x590179(0x1ec)},{'name':a0_0x590179(0x206),'shorthand':a0_0x590179(0x234),'nullable':!![],'purpose':a0_0x590179(0x222)}],'convention':{'emitInSkeleton':a0_0x590179(0x225),'nullablePolicy':'All\x204\x20columns\x20are\x20nullable.\x20The\x20created_by/updated_by\x20columns\x20may\x20be\x20empty\x20for\x20rows\x20inserted\x20by\x20system\x20seeds,\x20migrations,\x20or\x20batch\x20imports\x20that\x20do\x20not\x20have\x20a\x20user\x20context.','relationToRdf':a0_0x590179(0x220)}},SHORTHAND_SYNTAX={'format':a0_0x590179(0x1e8),'description':a0_0x590179(0x24c),'rules':['Type\x20is\x20mandatory\x20at\x20the\x20beginning\x20and\x20must\x20be\x20one\x20of\x20fieldTypes.','Modifier\x20is\x20mandatory\x20for\x20type\x20\x22string\x22\x20(length)\x20and\x20\x22decimal\x22\x20(precision,scale).',a0_0x590179(0x243),'Value\x20constraints\x20(default,\x20fk)\x20require\x20constraint:value\x20format.','Default\x20value\x20format\x20depends\x20on\x20type:\x20raw\x20for\x20boolean\x20(default:true),\x20raw\x20for\x20integer\x20(default:0),\x20single-quoted\x20for\x20string\x20(default:\x27value\x27),\x20bare\x20identifier\x20for\x20SQL\x20constants\x20(default:current_date),\x20identifier()\x20for\x20native\x20function\x20calls\x20(default:now()).','Foreign\x20key\x20uses\x20dot\x20notation:\x20fk:<table>.<column>\x20(e.g.,\x20fk:category.id).\x20The\x20parser\x20rejects\x20parentheses\x20syntax.'],'examples':[{'input':'string:36\x20pk','meaning':'VARCHAR(36)\x20PRIMARY\x20KEY'},{'input':a0_0x590179(0x24d),'meaning':'VARCHAR(255)\x20NOT\x20NULL'},{'input':a0_0x590179(0x207),'meaning':'DECIMAL(15,2)\x20NOT\x20NULL\x20DEFAULT\x200'},{'input':a0_0x590179(0x231),'meaning':a0_0x590179(0x250)},{'input':'string:100\x20default:\x27pending\x27','meaning':a0_0x590179(0x233)},{'input':'timestamp\x20default:now()','meaning':'TIMESTAMP\x20DEFAULT\x20<native_now\x20per\x20dialect>'},{'input':'string:36\x20fk:category.id','meaning':a0_0x590179(0x24b)},{'input':'string:64\x20index','meaning':a0_0x590179(0x1e3)}]},NAMING_RULES={'tableName':{'format':'snake_case','description':a0_0x590179(0x1e7)},'fieldName':{'format':'snake_case','description':'Column\x20name\x20must\x20be\x20snake_case.'},'constraintName':{'format':a0_0x590179(0x22d),'defaultMaxLength':0x1e,'fallbackStrategy':a0_0x590179(0x1f0),'description':a0_0x590179(0x240)},'compositeShortName':{'description':a0_0x590179(0x1e5)}},DIALECT_SUPPORT=[{'name':a0_0x590179(0x251),'driver':'pg','booleanStorage':a0_0x590179(0x1fe)},{'name':a0_0x590179(0x1eb),'driver':a0_0x590179(0x210),'booleanStorage':a0_0x590179(0x211)},{'name':a0_0x590179(0x253),'driver':'oracledb','booleanStorage':'VARCHAR2\x20with\x20CHECK\x20constraint'},{'name':a0_0x590179(0x1e9),'driver':'better-sqlite3','booleanStorage':'TEXT'}],DBSCHEMA_CATALOG={'schemaVersion':SCHEMA_VERSION,'source':SOURCE,'summary':{'totalDefineModelOptions':DEFINE_MODEL_OPTIONS[a0_0x590179(0x213)],'totalFieldTypes':FIELD_TYPES[a0_0x590179(0x213)],'totalConstraints':CONSTRAINTS['length'],'totalRelationTypes':RELATION_TYPES[a0_0x590179(0x213)],'totalReferentialActions':REFERENTIAL_ACTIONS[a0_0x590179(0x213)],'totalCheckOperations':CHECK_OPERATIONS['length'],'totalAuditColumns':AUDIT_COLUMNS[a0_0x590179(0x1f3)]['length'],'totalDialects':DIALECT_SUPPORT[a0_0x590179(0x213)]},'defineModelOptions':DEFINE_MODEL_OPTIONS,'fieldTypes':FIELD_TYPES,'constraints':CONSTRAINTS,'relationTypes':RELATION_TYPES,'referentialActions':REFERENTIAL_ACTIONS,'checkOperations':CHECK_OPERATIONS,'auditColumns':AUDIT_COLUMNS,'shorthandSyntax':SHORTHAND_SYNTAX,'namingRules':NAMING_RULES,'dialectSupport':DIALECT_SUPPORT,'documentationUrl':DOCUMENTATION_URL};module[a0_0x590179(0x1ff)]={'DBSCHEMA_CATALOG':DBSCHEMA_CATALOG,'DEFINE_MODEL_OPTIONS':DEFINE_MODEL_OPTIONS,'FIELD_TYPES':FIELD_TYPES,'CONSTRAINTS':CONSTRAINTS,'RELATION_TYPES':RELATION_TYPES,'REFERENTIAL_ACTIONS':REFERENTIAL_ACTIONS,'CHECK_OPERATIONS':CHECK_OPERATIONS,'AUDIT_COLUMNS':AUDIT_COLUMNS,'SHORTHAND_SYNTAX':SHORTHAND_SYNTAX,'NAMING_RULES':NAMING_RULES,'DIALECT_SUPPORT':DIALECT_SUPPORT};function a0_0x2390(_0x3985a3,_0x55c121){_0x3985a3=_0x3985a3-0x1e0;const _0x1242d5=a0_0x1242();let _0x2390af=_0x1242d5[_0x3985a3];if(a0_0x2390['acHuqv']===undefined){var _0x3d6767=function(_0x1f6646){const _0x15ea7f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x385827='',_0xea4e83='';for(let _0x57b017=0x0,_0x50246c,_0x543953,_0x53000b=0x0;_0x543953=_0x1f6646['charAt'](_0x53000b++);~_0x543953&&(_0x50246c=_0x57b017%0x4?_0x50246c*0x40+_0x543953:_0x543953,_0x57b017++%0x4)?_0x385827+=String['fromCharCode'](0xff&_0x50246c>>(-0x2*_0x57b017&0x6)):0x0){_0x543953=_0x15ea7f['indexOf'](_0x543953);}for(let _0x106758=0x0,_0x23bd56=_0x385827['length'];_0x106758<_0x23bd56;_0x106758++){_0xea4e83+='%'+('00'+_0x385827['charCodeAt'](_0x106758)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xea4e83);};a0_0x2390['zoWnNF']=_0x3d6767,a0_0x2390['ULMWdT']={},a0_0x2390['acHuqv']=!![];}const _0x705f5c=_0x1242d5[0x0],_0x25e953=_0x3985a3+_0x705f5c,_0x106d78=a0_0x2390['ULMWdT'][_0x25e953];return!_0x106d78?(_0x2390af=a0_0x2390['zoWnNF'](_0x2390af),a0_0x2390['ULMWdT'][_0x25e953]=_0x2390af):_0x2390af=_0x106d78,_0x2390af;}function a0_0x1242(){const _0x3ee7b1=['nJuXnMHyzhDqua','uMvJB3jKignYzwf0Aw9UihrPBwvZDgfTCc4Gqxv0BY1ZzxqGB24Gsu5trvjuihzPysberuzbvuXuig5VDYGPlIboyxrPDMuGzNvUy3rPB24GDhjHBNnSyxrLCYbWzxiGzgLHBgvJDcaOCg9ZDgDYzxm6ienvuLjftLrFveLnrvnuqu1qlcbTExnXBdOGtK9xkcKSig9YywnSztOGu1LtveLnrvnuqu1qlcbZCwXPDgu6ienvuLjftLrFveLnrvnuqu1qks4','tM9UlxvUAxf1zsbPBMrLEgvZlIbfywnOigvUDhj5igLZigfYCMf5ig9MignVBhvTBIbUyw1LCYbVCIbVyMPLy3qGEYbUyw1LlcbJB2X1Bw5Zih0U','C3rYAw5N','Aw50zwDLCG','rgvMyxvSDcb2ywX1zs4Gu2LUz2XLlxf1B3rLzcbMB3iGC3rYAw5NCYWGCMf3igzVCIbUDw1LCMLJl2jVB2XLyw4SigjHCMuGAwrLBNrPzMLLCIbMB3iGu1fmignVBNn0yw50CYWGAwrLBNrPzMLLCIGPigzVCIbUyxrPDMuGzNvUy3rPB24Gy2fSBhmU','DgfYz2v0','C3rHBMrHBg9Uzq','q29UC3rYywLUDcbUyw1LCYbHDxrVlwDLBMvYyxrLzcb3AxrOihr5CguTC3bLy2LMAwmGChjLzML4icHWAYWGzMSSigLKEcWGDxeSignRksbHBMqGzgLHBgvJDc1ZCgvJAwzPyYbTyxGGBgvUz3rOlG','Bg9JywXlzxK','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhrLoIaXmdaGFq','u3rHBMrHBg9UzsbJB25ZDhjHAw50CYaOCgSSig5VDg51BgWSihvUAxf1zsWGAw5KzxGPihrHA2uGBM8GDMfSDwuUifrOzsbSzwDHy3KGyxv0B1vWzgf0zsb0B2TLBIbPCYbZDgLSBcbWyxjZzwqGzM9YigjHy2T3yxjKignVBxbHDgLIAwXPDhKGyNv0igLZigrLChjLy2f0zwqGyw5KigHHCYbUBYbMDw5JDgLVBMfSigvMzMvJDc4','C2v0tNvSBa','y2HLy2TZ','C3rYAw5NoJi1nq','qM9VBgvHBIb2ywX1zsaOBMf0AxzLiejpt0Xfqu4GB24Gug9ZDgDYzvnrtcWGvKfsq0HbuIbVBIbVDgHLCNmPlG','zMS6phrHyMXLpI48y29SDw1UpG','CMvMzxjLBMnLCW','odC1nJa0AhLOwwrd','vKfsq0HbuIGZnIKGD2L0AcbgsYb0BYbJyxrLz29YEsHPzcKSigf1Dg8GyMvSB25NC1rVihjLBgf0Aw9U','u3rYAw5NihnOB3j0AgfUzcbMB3iGzMLLBgqGzgvMAw5PDgLVBI4GvhLWzsbYzxf1AxjLzcbHDcbZDgfYDcWGzM9SBg93zwqGyNKGB3b0Aw9UywWGBw9KAwzPzxiGyw5KihnWywnLlxnLCgfYyxrLzcbJB25ZDhjHAw50CY4','C3rYAw5NoJi1nsbUB3rUDwXS','C3rYAw5NFgfYCMf5','BNvTzxjPyW','qK9ptevbtIberuzbvuXuifrsvuu','Cg9ZDgDYzxm','nZj5Egjps2O','B3jHy2XL','C2nHBgfY','BNvSBcbVCIbLBxb0EsbZDhjPBMCGBwvHBNmGzgvMyxvSDcbZy2HLBweU','tM90igvXDwfSihrVlG','q2fZy2fKzsbKzwXLDguVDxbKyxrLihrVignOAwXKihjVD3mU','EYbPzdOGiNn0CMLUzZOZnIbWAYiSig5HBwu6icjZDhjPBMC6mJu1ig5VDg51BgWIih0','sLnptIbJB2X1Bw4GkePtt05cig9UifbVC3rNCMvtuuWSiePtt04GB24GtxLtuuWSienmt0iGB24Gt3jHy2XLks4','z3rL','u2v0iezlignVBhvTBIb0BYbovuXmig9UignOAwXKihjVD3mU','vKfsq0HbuIG2ncKGD2L0AcbZAw5NBguTy29SDw1UigLUzgv4','yhjLzMvYzw5JzxnGigLZihrOzsbIyxjLignVBhvTBIbUyw1LigLUihrOzsb0yxjNzxqGDgfIBguUifrHCMDLDcb0ywjSzsbPCYbHDxrVlwrLCML2zwqGzNjVBsb0AguGCMvSyxrPB24GA2v5ig5HBwuSig9Yig92zxjYAwrLihDPDgGGyhrHCMDLDgaU','rM9YignVBxbVC2L0zsbPBMrLEgvZl3vUAxf1zxmSig5HBwuGAxmGzgvYAxzLzcbIEsbQB2LUAw5NignVBhvTBNmGD2L0Acb1BMrLCNnJB3jLigfUzcb0CNvUy2f0Aw5NihDOzw4GBMvLzgvKlG','rxf1ywWGDg8U','vgfIBguGBMfTzsbTDxn0igjLigXVD2vYy2fZzsWGzgLNAxrZlcbHBMqGDw5KzxjZy29YzxmGB25SEs4','phr5Cgu+wZO8Bw9KAwzPzxi+xsbBpgnVBNn0CMfPBNq+wZO8DMfSDwu+xv0UlI4','C3fSAxrL','BhrL','BxLZCwW','tgfZDcbTB2rPzMLJyxrPB24GDgLTzxn0yw1WlIbbDxrVlxvWzgf0zsbPCYbOyw5KBgvKigj5ihrOzsbsreyGCNvUDgLTzsaOqMfZzu1VzgvSigf1zgL0q29SDw1UCYbJB252zw50Aw9Uksb3AgLJAcbPBMPLy3rZihvWzgf0zwrFyxqGpsbdvvjsru5ux1rjtuvtvefnucbPBNrVigv2zxj5ifvqrefursbZDgf0zw1LBNqGyMfZzwqGB24GzMLLBgqGBMfTAw5NlcbUB3qGyNKGyw55ifnerIbTyxjRzxiUieLUAxrPywWGsu5trvjuihzHBhvLigLZigfSC28GAgfUzgXLzcbIEsb0AguGuKrgihj1BNrPBwuGyxvKAxrdB2X1Bw5ZigHLBhbLCI4','vw5PCxvLignVBNn0CMfPBNrZicHZAw5NBguGB3iGy29TCg9ZAxrLks4','yMLNAw50','mZiTyML0ihnPz25LzcbPBNrLz2vYicHjtLqVsu5uruDfuIKU','tuq1igHHC2GGoc1JAgfYywn0zxiGC3vMzML4ihDOzw4GBMfTzsbLEgnLzwrZig1HEeXLBMD0Aa','mtyZnJeXmdnZDMvTDeG','yMvSB25NC1rV','y29SDw1UCW','EYb0ExbLoIaIyMvSB25NC1rViIWGBg9JywXlzxK6icjJyxrLz29YEv9PzciSihjLzMvYzw5Jzxm6icjJyxrLz29YEv9PzciSig9UrgvSzxrLoIaICMvZDhjPy3qIih0','rxHWBgLJAxqGBgvUz3rOihjLCxvPCMvKigzVCIbJCM9ZCY1KAwfSzwn0ihbVCNrHyMLSAxr5lG','ntGWody3mKX1B0PhyG','mtuWnvjxseT5Bq','C3rYAw5NoJXSzw5NDgG+','CMvZDhjPy3q','u2LUz2XLlwnVBhvTBIbUB24TDw5PCxvLigLUzgv4lG','twfYA3mGzMLLBgqGyxmGChjPBwfYEsbRzxKU','BM9by3rPB24','yxjYyxK','BMf0AxzLiejpt0Xfqu4','zxHWB3j0CW','uMvQzwn0igrLBgv0zs91CgrHDguGD2HLBIbJAgLSzcbYB3DZigv4Axn0lG','tgvZCYb0AgfUig9YigvXDwfSihrVlG','uhjLy2LZAw9UigfUzcbZy2fSzsbYzxf1AxjLzcbMB3iGy3jVC3mTzgLHBgvJDcbWB3j0ywjPBgL0Es4','t3zLCNjPzguGChjPBwfYEsbRzxKUifnPBMDSzsbMAwvSzcbUyw1Lig9YignVBxbVC2L0zsbHCNjHEs4','zgvMyxvSDa','mte0mJH2EuD4qKC','DxbKyxrLzf9IEq','zgvJAw1HBdOXnsWYig5VDg51BgWGzgvMyxvSDdOW','B25vCgrHDgu','DhLWzq','Ahr0Chm6lY9Yzxn0zM9Yz2uUzgv2l2rVy3mVy2XPl3nJAgvTys1KzwzPBML0Aw9U','Dw5PCxvLCW','EYbMAwvSzdOGiNf0EsiSigD0oIaWih0','yxv0B1vWzgf0zq','B2jQzwn0','t25LlxrVlw1HBNKGkgLUDMvYC2uGB2yGyMvSB25NC1rVks4Gt3b0Aw9UywWGAw52zxjZzsbKzwnSyxjHDgLVBIbVBIb0AguGCgfYzw50ihnPzgu7igrVzxmGBM90igfMzMvJDcbereWU','BxLZCwWY','vKfsq0HbuIaOBgL0zxjHBcaIDhj1zsiViMzHBhnLiIK','DgLTzxn0yw1W','BgvUz3rO','B25ezwXLDgu','DMfSDwu','nJqTyML0ihnPz25LzcbPBNrLz2vYicHcsuDjtLqPlG','EYbMAwvSzdOGiMrPC2nVDw50iIWGBhq6ideWmcb9','zgf0zq','rgf0ywjHC2uGC2nOzw1Hig5HBwvZCgfJzsaOBxvSDgKTC2nOzw1HigrHDgfIyxnLks4','zMLLBgrZ','EYbMAwvSzdOGiNf0EsiSigD0ztOGmcb9','Aw5KzxG','u3rHBMrHCMqGnc1JB2X1Bw4GyxvKAxqGy29UDMvUDgLVBIbMB3iGDgfIBgvZig1HBMfNzwqGyNKGuKvtvezVCMDLlIbuAguGC2fTzsbJB252zw50Aw9UigLZigrVy3vTzw50zwqGAw4GzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9NicHHDwrPDenVBhvTBNmGC2vJDgLVBIKGzM9YihrOzsbsreyVyMfJA2vUzcbSyxLLCI4Gu0rgigfUzcbsreyGC3rHEsbHBgLNBMvKihDOzw4GyM90AcbKzwnSyxjLihrOzxnLidqGy29SDw1UCY4','C3rYAw5NoJm2ihbR','w3SGzMLLBgq6icjZDgf0DxmIlcbPBJOGwYjHy3rPDMuIlcaIAw5Hy3rPDMuIxsb9lcb7igzPzwXKoIaICxr5iIWGz3rLoIaWih1D','vgHLifjerIbNzw5LCMf0B3iGkgnVzgvNzw5Fy3jLyxrLx2vUzhbVAw50ksbHC3n1BwvZihrOzxnLidqGy29SDw1UCYbLEgLZDcb3AgvUihrOzsbWyxLSB2fKlMf1zgL0q29SDw1UCYbRzxKGAxmGywjZzw50lIbtzwuGzMLLBgqTDMfSAwrHDgLVBJPJyxrHBg9Nigf1zgL0q29SDw1UCYbMB3iGDgHLifjerI1ZAwrLigjLAgf2Aw9YlIbeCMLMDcbIzxr3zwvUifnerIaOBwLZC2LUzYbHDwrPDcbJB2X1Bw5ZksbHBMqGuKrgicHHC3n1BwvZigf1zgL0ignVBhvTBNmPignHDxnLCYbYDw50Aw1LigvYCM9YCYb3AgvUihrOzsbNzw5LCMf0zwqGzw5KCg9PBNqGDhjPzxmGDg8GD3jPDguGy3jLyxrLzf9IEs91CgrHDgvKx2j5ihrVigeGBM9Ulwv4Axn0zw50ignVBhvTBI4','mZaYodi4v0LzrvvZ','vxnLCIbPzgvUDgLMAwvYig9MihrOzsbSyxn0ig1VzgLMAwvYlIbtzxqGyNKGyxbWBgLJyxrPB24GBgf5zxiGB24GvvbeqvrflcbUB3qGyNKGzgf0ywjHC2uGzgvMyxvSDc4','r3jLyxrLCIb0AgfUlG','mte0ntblChjUBfi','wwvZiokaLcbKyNnJAgvTytPPBML0igvTAxrZigfSBca0ignVBhvTBNmGyNKGzgvMyxvSDc4GvgfIBgvZihrOyxqGzg8GBM90ig5LzwqGyxvKAxqGkgXVB2T1Ccb0ywjSzxmSihn5C3rLBsb0ywjSzxmPignHBIbTyw51ywXSEsbYzw1VDMuGDgHLC2uGzMLLBgrZigzYB20GDgHLigDLBMvYyxrLzcbZA2vSzxrVBI4','rgvMyxvSDcb0Aw1LEM9UzsbIzwHHDMLVCIbPCYbKAwfSzwn0lxnWzwnPzMLJlG','EYbMAwvSzdOGiNr5CguIlcbUzxe6icjZExn0zw0Iih0','EYb0ExbLoIaIAgfZtwfUEsiSihrHCMDLDdOGiM9YzgvYx2L0zw0IlcbSB2nHBeTLEtOGiM9YzgvYx2LKiIWGCMvMzxjLBMnLCZOGiM9YzgvYx2LKiIb9','mJfzyvLstfa','ANnVBG','tgvZCYb0AgfUlG','t2jQzwn0ig9MigzPzwXKigrLzMLUAxrPB25ZigLUihnOB3j0AgfUzcbZDhjPBMCGzM9YBwf0lG','phbYzwzPEd5FphrHyMXLpL88C3vMzML4pG','zgvJAw1HBdO8ChjLy2LZAw9UpIW8C2nHBgu+','y3jLyxrLzf9HDa','rgf0zsbVBMX5icHUBYb0Aw1LignVBxbVBMvUDcKU','yM9VBgvHBIbKzwzHDwX0oNrYDwu','BMvX','vKfsq0HbuIGXmdaPierfrKfvtfqGj3bLBMrPBMCN','C3rYAw5NoJeWma','nZi3nZu1zw51Bu5S','C3rYAw5NFg51BgW','rgvMzxiGy29UC3rYywLUDcbJAgvJAYaOC2vTyw50AwnHBgX5ihnPBwLSyxiGDg8GCMvZDhjPy3qGB24GBw9ZDcbKAwfSzwn0CYKU'];a0_0x1242=function(){return _0x3ee7b1;};return a0_0x1242();}