@xylabs/aries 0.1.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 (421) hide show
  1. package/README.md +693 -0
  2. package/dist/actions/audit/auditPaths.mjs +22 -0
  3. package/dist/actions/audit/auditPaths.mjs.map +1 -0
  4. package/dist/actions/audit/index.mjs +739 -0
  5. package/dist/actions/audit/index.mjs.map +1 -0
  6. package/dist/actions/audit/installPlugin.mjs +298 -0
  7. package/dist/actions/audit/installPlugin.mjs.map +1 -0
  8. package/dist/actions/audit/listSessions.mjs +93 -0
  9. package/dist/actions/audit/listSessions.mjs.map +1 -0
  10. package/dist/actions/audit/openAuditDir.mjs +44 -0
  11. package/dist/actions/audit/openAuditDir.mjs.map +1 -0
  12. package/dist/actions/audit/searchAudit.mjs +77 -0
  13. package/dist/actions/audit/searchAudit.mjs.map +1 -0
  14. package/dist/actions/audit/showAiMeta.mjs +105 -0
  15. package/dist/actions/audit/showAiMeta.mjs.map +1 -0
  16. package/dist/actions/audit/showSession.mjs +105 -0
  17. package/dist/actions/audit/showSession.mjs.map +1 -0
  18. package/dist/actions/audit/statusAudit.mjs +98 -0
  19. package/dist/actions/audit/statusAudit.mjs.map +1 -0
  20. package/dist/actions/clamp/clampAudit.mjs +53 -0
  21. package/dist/actions/clamp/clampAudit.mjs.map +1 -0
  22. package/dist/actions/clamp/index.mjs +2258 -0
  23. package/dist/actions/clamp/index.mjs.map +1 -0
  24. package/dist/actions/clamp/ipcServer.mjs +55 -0
  25. package/dist/actions/clamp/ipcServer.mjs.map +1 -0
  26. package/dist/actions/clamp/policyManagement.mjs +144 -0
  27. package/dist/actions/clamp/policyManagement.mjs.map +1 -0
  28. package/dist/actions/clamp/promptUser.mjs +91 -0
  29. package/dist/actions/clamp/promptUser.mjs.map +1 -0
  30. package/dist/actions/clamp/runClamped.mjs +2107 -0
  31. package/dist/actions/clamp/runClamped.mjs.map +1 -0
  32. package/dist/actions/clamp/sandboxExec.mjs +1612 -0
  33. package/dist/actions/clamp/sandboxExec.mjs.map +1 -0
  34. package/dist/actions/clamp/shellEnvSetup.mjs +59 -0
  35. package/dist/actions/clamp/shellEnvSetup.mjs.map +1 -0
  36. package/dist/actions/clamp/shimGenerator.mjs +68 -0
  37. package/dist/actions/clamp/shimGenerator.mjs.map +1 -0
  38. package/dist/actions/clamp/terminalRenderer.mjs +145 -0
  39. package/dist/actions/clamp/terminalRenderer.mjs.map +1 -0
  40. package/dist/actions/datalake/audit/auditLog.mjs +191 -0
  41. package/dist/actions/datalake/audit/auditLog.mjs.map +1 -0
  42. package/dist/actions/datalake/createDatalake.mjs +127 -0
  43. package/dist/actions/datalake/createDatalake.mjs.map +1 -0
  44. package/dist/actions/datalake/describeDatalake.mjs +159 -0
  45. package/dist/actions/datalake/describeDatalake.mjs.map +1 -0
  46. package/dist/actions/datalake/destroyDatalake.mjs +34 -0
  47. package/dist/actions/datalake/destroyDatalake.mjs.map +1 -0
  48. package/dist/actions/datalake/dev/downDevServer.mjs +102 -0
  49. package/dist/actions/datalake/dev/downDevServer.mjs.map +1 -0
  50. package/dist/actions/datalake/dev/index.mjs +369 -0
  51. package/dist/actions/datalake/dev/index.mjs.map +1 -0
  52. package/dist/actions/datalake/dev/logsDevServer.mjs +44 -0
  53. package/dist/actions/datalake/dev/logsDevServer.mjs.map +1 -0
  54. package/dist/actions/datalake/dev/paths.mjs +25 -0
  55. package/dist/actions/datalake/dev/paths.mjs.map +1 -0
  56. package/dist/actions/datalake/dev/resetDevServer.mjs +118 -0
  57. package/dist/actions/datalake/dev/resetDevServer.mjs.map +1 -0
  58. package/dist/actions/datalake/dev/resolveServerBin.mjs +26 -0
  59. package/dist/actions/datalake/dev/resolveServerBin.mjs.map +1 -0
  60. package/dist/actions/datalake/dev/state.mjs +62 -0
  61. package/dist/actions/datalake/dev/state.mjs.map +1 -0
  62. package/dist/actions/datalake/dev/statusDevServer.mjs +101 -0
  63. package/dist/actions/datalake/dev/statusDevServer.mjs.map +1 -0
  64. package/dist/actions/datalake/dev/upDevServer.mjs +221 -0
  65. package/dist/actions/datalake/dev/upDevServer.mjs.map +1 -0
  66. package/dist/actions/datalake/dev/waitForHealth.mjs +22 -0
  67. package/dist/actions/datalake/dev/waitForHealth.mjs.map +1 -0
  68. package/dist/actions/datalake/formatters.mjs +90 -0
  69. package/dist/actions/datalake/formatters.mjs.map +1 -0
  70. package/dist/actions/datalake/grantAccess.mjs +116 -0
  71. package/dist/actions/datalake/grantAccess.mjs.map +1 -0
  72. package/dist/actions/datalake/index.mjs +361 -0
  73. package/dist/actions/datalake/index.mjs.map +1 -0
  74. package/dist/actions/datalake/listDatalakes.mjs +54 -0
  75. package/dist/actions/datalake/listDatalakes.mjs.map +1 -0
  76. package/dist/actions/datalake/login.mjs +20 -0
  77. package/dist/actions/datalake/login.mjs.map +1 -0
  78. package/dist/actions/datalake/logout.mjs +11 -0
  79. package/dist/actions/datalake/logout.mjs.map +1 -0
  80. package/dist/actions/datalake/mintToken.mjs +37 -0
  81. package/dist/actions/datalake/mintToken.mjs.map +1 -0
  82. package/dist/actions/datalake/parseSize.mjs +21 -0
  83. package/dist/actions/datalake/parseSize.mjs.map +1 -0
  84. package/dist/actions/datalake/payloads/fetchPayload.mjs +76 -0
  85. package/dist/actions/datalake/payloads/fetchPayload.mjs.map +1 -0
  86. package/dist/actions/datalake/payloads/index.mjs +271 -0
  87. package/dist/actions/datalake/payloads/index.mjs.map +1 -0
  88. package/dist/actions/datalake/payloads/mintAndConnect.mjs +46 -0
  89. package/dist/actions/datalake/payloads/mintAndConnect.mjs.map +1 -0
  90. package/dist/actions/datalake/payloads/parsePayloadsFile.mjs +71 -0
  91. package/dist/actions/datalake/payloads/parsePayloadsFile.mjs.map +1 -0
  92. package/dist/actions/datalake/payloads/pushPayloads.mjs +181 -0
  93. package/dist/actions/datalake/payloads/pushPayloads.mjs.map +1 -0
  94. package/dist/actions/datalake/payloads/tailPayloads.mjs +106 -0
  95. package/dist/actions/datalake/payloads/tailPayloads.mjs.map +1 -0
  96. package/dist/actions/datalake/resolveTarget.mjs +15 -0
  97. package/dist/actions/datalake/resolveTarget.mjs.map +1 -0
  98. package/dist/actions/datalake/revokeAccess.mjs +108 -0
  99. package/dist/actions/datalake/revokeAccess.mjs.map +1 -0
  100. package/dist/actions/datalake/useDatalake.mjs +22 -0
  101. package/dist/actions/datalake/useDatalake.mjs.map +1 -0
  102. package/dist/actions/detect/detectAiClients.mjs +405 -0
  103. package/dist/actions/detect/detectAiClients.mjs.map +1 -0
  104. package/dist/actions/detect/index.mjs +405 -0
  105. package/dist/actions/detect/index.mjs.map +1 -0
  106. package/dist/actions/hash/algorithms/blockhash.mjs +61 -0
  107. package/dist/actions/hash/algorithms/blockhash.mjs.map +1 -0
  108. package/dist/actions/hash/algorithms/chromaprint.mjs +205 -0
  109. package/dist/actions/hash/algorithms/chromaprint.mjs.map +1 -0
  110. package/dist/actions/hash/algorithms/dhash.mjs +75 -0
  111. package/dist/actions/hash/algorithms/dhash.mjs.map +1 -0
  112. package/dist/actions/hash/algorithms/index.mjs +818 -0
  113. package/dist/actions/hash/algorithms/index.mjs.map +1 -0
  114. package/dist/actions/hash/algorithms/nilsimsa.mjs +27 -0
  115. package/dist/actions/hash/algorithms/nilsimsa.mjs.map +1 -0
  116. package/dist/actions/hash/algorithms/pdq.mjs +83 -0
  117. package/dist/actions/hash/algorithms/pdq.mjs.map +1 -0
  118. package/dist/actions/hash/algorithms/phash.mjs +71 -0
  119. package/dist/actions/hash/algorithms/phash.mjs.map +1 -0
  120. package/dist/actions/hash/algorithms/sha256.mjs +24 -0
  121. package/dist/actions/hash/algorithms/sha256.mjs.map +1 -0
  122. package/dist/actions/hash/algorithms/ssdeep.mjs +203 -0
  123. package/dist/actions/hash/algorithms/ssdeep.mjs.map +1 -0
  124. package/dist/actions/hash/algorithms/tlsh.mjs +66 -0
  125. package/dist/actions/hash/algorithms/tlsh.mjs.map +1 -0
  126. package/dist/actions/hash/algorithms/types.mjs +1 -0
  127. package/dist/actions/hash/algorithms/types.mjs.map +1 -0
  128. package/dist/actions/hash/algorithms/videoFrames.mjs +404 -0
  129. package/dist/actions/hash/algorithms/videoFrames.mjs.map +1 -0
  130. package/dist/actions/hash/algorithms/xyo.mjs +30 -0
  131. package/dist/actions/hash/algorithms/xyo.mjs.map +1 -0
  132. package/dist/actions/hash/compareHashes.mjs +823 -0
  133. package/dist/actions/hash/compareHashes.mjs.map +1 -0
  134. package/dist/actions/hash/hashInput.mjs +868 -0
  135. package/dist/actions/hash/hashInput.mjs.map +1 -0
  136. package/dist/actions/hash/index.mjs +881 -0
  137. package/dist/actions/hash/index.mjs.map +1 -0
  138. package/dist/actions/hash/lib/hamming.mjs +44 -0
  139. package/dist/actions/hash/lib/hamming.mjs.map +1 -0
  140. package/dist/actions/hash/lib/levenshtein.mjs +36 -0
  141. package/dist/actions/hash/lib/levenshtein.mjs.map +1 -0
  142. package/dist/actions/hash/lib/runBinary.mjs +54 -0
  143. package/dist/actions/hash/lib/runBinary.mjs.map +1 -0
  144. package/dist/actions/hash/lib/which.mjs +36 -0
  145. package/dist/actions/hash/lib/which.mjs.map +1 -0
  146. package/dist/actions/hash/lib/withTempfile.mjs +19 -0
  147. package/dist/actions/hash/lib/withTempfile.mjs.map +1 -0
  148. package/dist/actions/index.mjs +4615 -0
  149. package/dist/actions/index.mjs.map +1 -0
  150. package/dist/actions/printVersion.mjs +12 -0
  151. package/dist/actions/printVersion.mjs.map +1 -0
  152. package/dist/actions/sync/index.mjs +51 -0
  153. package/dist/actions/sync/index.mjs.map +1 -0
  154. package/dist/actions/sync/syncAiConfig.mjs +51 -0
  155. package/dist/actions/sync/syncAiConfig.mjs.map +1 -0
  156. package/dist/actions/wallet/account/deriveAndAdd.mjs +394 -0
  157. package/dist/actions/wallet/account/deriveAndAdd.mjs.map +1 -0
  158. package/dist/actions/wallet/account/getActiveWallet.mjs +338 -0
  159. package/dist/actions/wallet/account/getActiveWallet.mjs.map +1 -0
  160. package/dist/actions/wallet/account/labelAccount.mjs +389 -0
  161. package/dist/actions/wallet/account/labelAccount.mjs.map +1 -0
  162. package/dist/actions/wallet/account/listAccounts.mjs +374 -0
  163. package/dist/actions/wallet/account/listAccounts.mjs.map +1 -0
  164. package/dist/actions/wallet/account/removeAccount.mjs +384 -0
  165. package/dist/actions/wallet/account/removeAccount.mjs.map +1 -0
  166. package/dist/actions/wallet/account/showAccount.mjs +368 -0
  167. package/dist/actions/wallet/account/showAccount.mjs.map +1 -0
  168. package/dist/actions/wallet/addressBook/storage.mjs +110 -0
  169. package/dist/actions/wallet/addressBook/storage.mjs.map +1 -0
  170. package/dist/actions/wallet/backup/exportBackup.mjs +93 -0
  171. package/dist/actions/wallet/backup/exportBackup.mjs.map +1 -0
  172. package/dist/actions/wallet/backup/importBackup.mjs +142 -0
  173. package/dist/actions/wallet/backup/importBackup.mjs.map +1 -0
  174. package/dist/actions/wallet/balance/getBalance.mjs +434 -0
  175. package/dist/actions/wallet/balance/getBalance.mjs.map +1 -0
  176. package/dist/actions/wallet/client/walletClient.mjs +64 -0
  177. package/dist/actions/wallet/client/walletClient.mjs.map +1 -0
  178. package/dist/actions/wallet/contact/contactActions.mjs +120 -0
  179. package/dist/actions/wallet/contact/contactActions.mjs.map +1 -0
  180. package/dist/actions/wallet/contact/storage.mjs +69 -0
  181. package/dist/actions/wallet/contact/storage.mjs.map +1 -0
  182. package/dist/actions/wallet/index.mjs +1439 -0
  183. package/dist/actions/wallet/index.mjs.map +1 -0
  184. package/dist/actions/wallet/network/networkActions.mjs +137 -0
  185. package/dist/actions/wallet/network/networkActions.mjs.map +1 -0
  186. package/dist/actions/wallet/network/storage.mjs +93 -0
  187. package/dist/actions/wallet/network/storage.mjs.map +1 -0
  188. package/dist/actions/wallet/password/changePassword.mjs +282 -0
  189. package/dist/actions/wallet/password/changePassword.mjs.map +1 -0
  190. package/dist/actions/wallet/password/getActiveKey.mjs +297 -0
  191. package/dist/actions/wallet/password/getActiveKey.mjs.map +1 -0
  192. package/dist/actions/wallet/password/initOrUnlock.mjs +337 -0
  193. package/dist/actions/wallet/password/initOrUnlock.mjs.map +1 -0
  194. package/dist/actions/wallet/password/passwordStorage.mjs +69 -0
  195. package/dist/actions/wallet/password/passwordStorage.mjs.map +1 -0
  196. package/dist/actions/wallet/password/setPassword.mjs +138 -0
  197. package/dist/actions/wallet/password/setPassword.mjs.map +1 -0
  198. package/dist/actions/wallet/password/validatePassword.mjs +123 -0
  199. package/dist/actions/wallet/password/validatePassword.mjs.map +1 -0
  200. package/dist/actions/wallet/passwordKey.mjs +87 -0
  201. package/dist/actions/wallet/passwordKey.mjs.map +1 -0
  202. package/dist/actions/wallet/paths.mjs +26 -0
  203. package/dist/actions/wallet/paths.mjs.map +1 -0
  204. package/dist/actions/wallet/prompt.mjs +93 -0
  205. package/dist/actions/wallet/prompt.mjs.map +1 -0
  206. package/dist/actions/wallet/seedPhrase/createPhrase.mjs +392 -0
  207. package/dist/actions/wallet/seedPhrase/createPhrase.mjs.map +1 -0
  208. package/dist/actions/wallet/seedPhrase/exportPhrase.mjs +334 -0
  209. package/dist/actions/wallet/seedPhrase/exportPhrase.mjs.map +1 -0
  210. package/dist/actions/wallet/seedPhrase/idGen.mjs +11 -0
  211. package/dist/actions/wallet/seedPhrase/idGen.mjs.map +1 -0
  212. package/dist/actions/wallet/seedPhrase/importPhrase.mjs +393 -0
  213. package/dist/actions/wallet/seedPhrase/importPhrase.mjs.map +1 -0
  214. package/dist/actions/wallet/seedPhrase/listPhrases.mjs +62 -0
  215. package/dist/actions/wallet/seedPhrase/listPhrases.mjs.map +1 -0
  216. package/dist/actions/wallet/seedPhrase/phraseStorage.mjs +89 -0
  217. package/dist/actions/wallet/seedPhrase/phraseStorage.mjs.map +1 -0
  218. package/dist/actions/wallet/seedPhrase/removePhrase.mjs +366 -0
  219. package/dist/actions/wallet/seedPhrase/removePhrase.mjs.map +1 -0
  220. package/dist/actions/wallet/seedPhrase/renamePhrase.mjs +78 -0
  221. package/dist/actions/wallet/seedPhrase/renamePhrase.mjs.map +1 -0
  222. package/dist/actions/wallet/seedPhrase/types.mjs +1 -0
  223. package/dist/actions/wallet/seedPhrase/types.mjs.map +1 -0
  224. package/dist/actions/wallet/seedPhrase/usePhrase.mjs +83 -0
  225. package/dist/actions/wallet/seedPhrase/usePhrase.mjs.map +1 -0
  226. package/dist/actions/wallet/session/machineId.mjs +145 -0
  227. package/dist/actions/wallet/session/machineId.mjs.map +1 -0
  228. package/dist/actions/wallet/session/sessionCache.mjs +221 -0
  229. package/dist/actions/wallet/session/sessionCache.mjs.map +1 -0
  230. package/dist/actions/wallet/session/unlock.mjs +307 -0
  231. package/dist/actions/wallet/session/unlock.mjs.map +1 -0
  232. package/dist/actions/wallet/sign/signPayload.mjs +637 -0
  233. package/dist/actions/wallet/sign/signPayload.mjs.map +1 -0
  234. package/dist/actions/wallet/storage.mjs +51 -0
  235. package/dist/actions/wallet/storage.mjs.map +1 -0
  236. package/dist/actions/wallet/transaction/broadcastTransaction.mjs +453 -0
  237. package/dist/actions/wallet/transaction/broadcastTransaction.mjs.map +1 -0
  238. package/dist/actions/wallet/transaction/sendTransaction.mjs +457 -0
  239. package/dist/actions/wallet/transaction/sendTransaction.mjs.map +1 -0
  240. package/dist/actions/wallet/transaction/signTransactionFile.mjs +378 -0
  241. package/dist/actions/wallet/transaction/signTransactionFile.mjs.map +1 -0
  242. package/dist/actions/xyo/index.mjs +138 -0
  243. package/dist/actions/xyo/index.mjs.map +1 -0
  244. package/dist/actions/xyo/transaction/index.mjs +138 -0
  245. package/dist/actions/xyo/transaction/index.mjs.map +1 -0
  246. package/dist/actions/xyo/transaction/validateTransactions.mjs +138 -0
  247. package/dist/actions/xyo/transaction/validateTransactions.mjs.map +1 -0
  248. package/dist/aries.mjs +8466 -0
  249. package/dist/aries.mjs.map +1 -0
  250. package/dist/bin/aries.mjs +8472 -0
  251. package/dist/bin/aries.mjs.map +1 -0
  252. package/dist/commands/aiCommand.mjs +492 -0
  253. package/dist/commands/aiCommand.mjs.map +1 -0
  254. package/dist/commands/auditAiCommand.mjs +119 -0
  255. package/dist/commands/auditAiCommand.mjs.map +1 -0
  256. package/dist/commands/auditCommand.mjs +857 -0
  257. package/dist/commands/auditCommand.mjs.map +1 -0
  258. package/dist/commands/auditInstallCommand.mjs +324 -0
  259. package/dist/commands/auditInstallCommand.mjs.map +1 -0
  260. package/dist/commands/auditListCommand.mjs +107 -0
  261. package/dist/commands/auditListCommand.mjs.map +1 -0
  262. package/dist/commands/auditOpenCommand.mjs +51 -0
  263. package/dist/commands/auditOpenCommand.mjs.map +1 -0
  264. package/dist/commands/auditSearchCommand.mjs +98 -0
  265. package/dist/commands/auditSearchCommand.mjs.map +1 -0
  266. package/dist/commands/auditShowCommand.mjs +123 -0
  267. package/dist/commands/auditShowCommand.mjs.map +1 -0
  268. package/dist/commands/auditStatusCommand.mjs +105 -0
  269. package/dist/commands/auditStatusCommand.mjs.map +1 -0
  270. package/dist/commands/clampCommand.mjs +2328 -0
  271. package/dist/commands/clampCommand.mjs.map +1 -0
  272. package/dist/commands/clampPolicyCommand.mjs +184 -0
  273. package/dist/commands/clampPolicyCommand.mjs.map +1 -0
  274. package/dist/commands/clampPolicyInitCommand.mjs +63 -0
  275. package/dist/commands/clampPolicyInitCommand.mjs.map +1 -0
  276. package/dist/commands/clampPolicyListCommand.mjs +56 -0
  277. package/dist/commands/clampPolicyListCommand.mjs.map +1 -0
  278. package/dist/commands/clampPolicyShowCommand.mjs +83 -0
  279. package/dist/commands/clampPolicyShowCommand.mjs.map +1 -0
  280. package/dist/commands/clampRunCommand.mjs +2137 -0
  281. package/dist/commands/clampRunCommand.mjs.map +1 -0
  282. package/dist/commands/datalakeAuditCommand.mjs +273 -0
  283. package/dist/commands/datalakeAuditCommand.mjs.map +1 -0
  284. package/dist/commands/datalakeCommand.mjs +1637 -0
  285. package/dist/commands/datalakeCommand.mjs.map +1 -0
  286. package/dist/commands/datalakeCreateCommand.mjs +189 -0
  287. package/dist/commands/datalakeCreateCommand.mjs.map +1 -0
  288. package/dist/commands/datalakeDescribeCommand.mjs +172 -0
  289. package/dist/commands/datalakeDescribeCommand.mjs.map +1 -0
  290. package/dist/commands/datalakeDestroyCommand.mjs +53 -0
  291. package/dist/commands/datalakeDestroyCommand.mjs.map +1 -0
  292. package/dist/commands/datalakeDevCommand.mjs +470 -0
  293. package/dist/commands/datalakeDevCommand.mjs.map +1 -0
  294. package/dist/commands/datalakeDevDownCommand.mjs +111 -0
  295. package/dist/commands/datalakeDevDownCommand.mjs.map +1 -0
  296. package/dist/commands/datalakeDevLogsCommand.mjs +65 -0
  297. package/dist/commands/datalakeDevLogsCommand.mjs.map +1 -0
  298. package/dist/commands/datalakeDevResetCommand.mjs +125 -0
  299. package/dist/commands/datalakeDevResetCommand.mjs.map +1 -0
  300. package/dist/commands/datalakeDevStatusCommand.mjs +110 -0
  301. package/dist/commands/datalakeDevStatusCommand.mjs.map +1 -0
  302. package/dist/commands/datalakeDevUpCommand.mjs +268 -0
  303. package/dist/commands/datalakeDevUpCommand.mjs.map +1 -0
  304. package/dist/commands/datalakeFetchCommand.mjs +106 -0
  305. package/dist/commands/datalakeFetchCommand.mjs.map +1 -0
  306. package/dist/commands/datalakeGrantCommand.mjs +147 -0
  307. package/dist/commands/datalakeGrantCommand.mjs.map +1 -0
  308. package/dist/commands/datalakeListCommand.mjs +61 -0
  309. package/dist/commands/datalakeListCommand.mjs.map +1 -0
  310. package/dist/commands/datalakeLoginCommand.mjs +39 -0
  311. package/dist/commands/datalakeLoginCommand.mjs.map +1 -0
  312. package/dist/commands/datalakeLogoutCommand.mjs +20 -0
  313. package/dist/commands/datalakeLogoutCommand.mjs.map +1 -0
  314. package/dist/commands/datalakePushCommand.mjs +214 -0
  315. package/dist/commands/datalakePushCommand.mjs.map +1 -0
  316. package/dist/commands/datalakeRevokeCommand.mjs +127 -0
  317. package/dist/commands/datalakeRevokeCommand.mjs.map +1 -0
  318. package/dist/commands/datalakeTailCommand.mjs +144 -0
  319. package/dist/commands/datalakeTailCommand.mjs.map +1 -0
  320. package/dist/commands/datalakeTokenCommand.mjs +61 -0
  321. package/dist/commands/datalakeTokenCommand.mjs.map +1 -0
  322. package/dist/commands/datalakeUseCommand.mjs +35 -0
  323. package/dist/commands/datalakeUseCommand.mjs.map +1 -0
  324. package/dist/commands/detectCommand.mjs +419 -0
  325. package/dist/commands/detectCommand.mjs.map +1 -0
  326. package/dist/commands/hashCommand.mjs +976 -0
  327. package/dist/commands/hashCommand.mjs.map +1 -0
  328. package/dist/commands/hashCompareCommand.mjs +865 -0
  329. package/dist/commands/hashCompareCommand.mjs.map +1 -0
  330. package/dist/commands/index.mjs +8461 -0
  331. package/dist/commands/index.mjs.map +1 -0
  332. package/dist/commands/syncCommand.mjs +66 -0
  333. package/dist/commands/syncCommand.mjs.map +1 -0
  334. package/dist/commands/versionCommand.mjs +24 -0
  335. package/dist/commands/versionCommand.mjs.map +1 -0
  336. package/dist/commands/walletAccountCommand.mjs +536 -0
  337. package/dist/commands/walletAccountCommand.mjs.map +1 -0
  338. package/dist/commands/walletAccountDeriveCommand.mjs +415 -0
  339. package/dist/commands/walletAccountDeriveCommand.mjs.map +1 -0
  340. package/dist/commands/walletAccountLabelCommand.mjs +405 -0
  341. package/dist/commands/walletAccountLabelCommand.mjs.map +1 -0
  342. package/dist/commands/walletAccountListCommand.mjs +381 -0
  343. package/dist/commands/walletAccountListCommand.mjs.map +1 -0
  344. package/dist/commands/walletAccountRemoveCommand.mjs +396 -0
  345. package/dist/commands/walletAccountRemoveCommand.mjs.map +1 -0
  346. package/dist/commands/walletAccountShowCommand.mjs +380 -0
  347. package/dist/commands/walletAccountShowCommand.mjs.map +1 -0
  348. package/dist/commands/walletBackupCommand.mjs +222 -0
  349. package/dist/commands/walletBackupCommand.mjs.map +1 -0
  350. package/dist/commands/walletBackupExportCommand.mjs +107 -0
  351. package/dist/commands/walletBackupExportCommand.mjs.map +1 -0
  352. package/dist/commands/walletBackupImportCommand.mjs +154 -0
  353. package/dist/commands/walletBackupImportCommand.mjs.map +1 -0
  354. package/dist/commands/walletBalanceCommand.mjs +448 -0
  355. package/dist/commands/walletBalanceCommand.mjs.map +1 -0
  356. package/dist/commands/walletCommand.mjs +1968 -0
  357. package/dist/commands/walletCommand.mjs.map +1 -0
  358. package/dist/commands/walletContactAddCommand.mjs +111 -0
  359. package/dist/commands/walletContactAddCommand.mjs.map +1 -0
  360. package/dist/commands/walletContactCommand.mjs +184 -0
  361. package/dist/commands/walletContactCommand.mjs.map +1 -0
  362. package/dist/commands/walletContactListCommand.mjs +66 -0
  363. package/dist/commands/walletContactListCommand.mjs.map +1 -0
  364. package/dist/commands/walletContactRemoveCommand.mjs +97 -0
  365. package/dist/commands/walletContactRemoveCommand.mjs.map +1 -0
  366. package/dist/commands/walletContactRenameCommand.mjs +114 -0
  367. package/dist/commands/walletContactRenameCommand.mjs.map +1 -0
  368. package/dist/commands/walletCreateCommand.mjs +407 -0
  369. package/dist/commands/walletCreateCommand.mjs.map +1 -0
  370. package/dist/commands/walletExportCommand.mjs +345 -0
  371. package/dist/commands/walletExportCommand.mjs.map +1 -0
  372. package/dist/commands/walletImportCommand.mjs +413 -0
  373. package/dist/commands/walletImportCommand.mjs.map +1 -0
  374. package/dist/commands/walletListCommand.mjs +69 -0
  375. package/dist/commands/walletListCommand.mjs.map +1 -0
  376. package/dist/commands/walletLockCommand.mjs +56 -0
  377. package/dist/commands/walletLockCommand.mjs.map +1 -0
  378. package/dist/commands/walletNetworkAddCommand.mjs +131 -0
  379. package/dist/commands/walletNetworkAddCommand.mjs.map +1 -0
  380. package/dist/commands/walletNetworkCommand.mjs +206 -0
  381. package/dist/commands/walletNetworkCommand.mjs.map +1 -0
  382. package/dist/commands/walletNetworkListCommand.mjs +104 -0
  383. package/dist/commands/walletNetworkListCommand.mjs.map +1 -0
  384. package/dist/commands/walletNetworkRemoveCommand.mjs +112 -0
  385. package/dist/commands/walletNetworkRemoveCommand.mjs.map +1 -0
  386. package/dist/commands/walletNetworkUseCommand.mjs +110 -0
  387. package/dist/commands/walletNetworkUseCommand.mjs.map +1 -0
  388. package/dist/commands/walletPasswordChangeCommand.mjs +291 -0
  389. package/dist/commands/walletPasswordChangeCommand.mjs.map +1 -0
  390. package/dist/commands/walletPasswordCommand.mjs +301 -0
  391. package/dist/commands/walletPasswordCommand.mjs.map +1 -0
  392. package/dist/commands/walletRemoveCommand.mjs +378 -0
  393. package/dist/commands/walletRemoveCommand.mjs.map +1 -0
  394. package/dist/commands/walletRenameCommand.mjs +94 -0
  395. package/dist/commands/walletRenameCommand.mjs.map +1 -0
  396. package/dist/commands/walletSignCommand.mjs +662 -0
  397. package/dist/commands/walletSignCommand.mjs.map +1 -0
  398. package/dist/commands/walletTxBroadcastCommand.mjs +473 -0
  399. package/dist/commands/walletTxBroadcastCommand.mjs.map +1 -0
  400. package/dist/commands/walletTxCommand.mjs +612 -0
  401. package/dist/commands/walletTxCommand.mjs.map +1 -0
  402. package/dist/commands/walletTxSendCommand.mjs +492 -0
  403. package/dist/commands/walletTxSendCommand.mjs.map +1 -0
  404. package/dist/commands/walletTxSignCommand.mjs +403 -0
  405. package/dist/commands/walletTxSignCommand.mjs.map +1 -0
  406. package/dist/commands/walletUnlockCommand.mjs +308 -0
  407. package/dist/commands/walletUnlockCommand.mjs.map +1 -0
  408. package/dist/commands/walletUseCommand.mjs +95 -0
  409. package/dist/commands/walletUseCommand.mjs.map +1 -0
  410. package/dist/commands/xyoCommand.mjs +188 -0
  411. package/dist/commands/xyoCommand.mjs.map +1 -0
  412. package/dist/commands/xyoTxCommand.mjs +178 -0
  413. package/dist/commands/xyoTxCommand.mjs.map +1 -0
  414. package/dist/commands/xyoTxValidateCommand.mjs +168 -0
  415. package/dist/commands/xyoTxValidateCommand.mjs.map +1 -0
  416. package/dist/index.d.ts +3 -0
  417. package/dist/index.mjs +8466 -0
  418. package/dist/index.mjs.map +1 -0
  419. package/dist/types/modules.d.mjs +1 -0
  420. package/dist/types/modules.d.mjs.map +1 -0
  421. package/package.json +197 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/actions/datalake/audit/auditLog.ts","../../src/actions/datalake/dev/paths.ts","../../src/commands/datalakeAuditCommand.ts","../../src/commands/datalakeCreateCommand.ts","../../src/actions/datalake/createDatalake.ts","../../src/actions/datalake/formatters.ts","../../src/actions/datalake/parseSize.ts","../../src/actions/datalake/describeDatalake.ts","../../src/actions/datalake/payloads/mintAndConnect.ts","../../src/actions/datalake/resolveTarget.ts","../../src/actions/datalake/destroyDatalake.ts","../../src/actions/datalake/grantAccess.ts","../../src/actions/datalake/listDatalakes.ts","../../src/actions/datalake/login.ts","../../src/actions/datalake/logout.ts","../../src/actions/datalake/mintToken.ts","../../src/actions/datalake/revokeAccess.ts","../../src/actions/datalake/useDatalake.ts","../../src/commands/datalakeDescribeCommand.ts","../../src/commands/datalakeDestroyCommand.ts","../../src/actions/datalake/dev/downDevServer.ts","../../src/actions/datalake/dev/state.ts","../../src/actions/datalake/dev/logsDevServer.ts","../../src/actions/datalake/dev/resetDevServer.ts","../../src/actions/datalake/dev/statusDevServer.ts","../../src/actions/datalake/dev/upDevServer.ts","../../src/actions/datalake/dev/resolveServerBin.ts","../../src/actions/datalake/dev/waitForHealth.ts","../../src/commands/datalakeDevDownCommand.ts","../../src/commands/datalakeDevLogsCommand.ts","../../src/commands/datalakeDevResetCommand.ts","../../src/commands/datalakeDevStatusCommand.ts","../../src/commands/datalakeDevUpCommand.ts","../../src/commands/datalakeDevCommand.ts","../../src/actions/datalake/payloads/fetchPayload.ts","../../src/actions/datalake/payloads/parsePayloadsFile.ts","../../src/actions/datalake/payloads/pushPayloads.ts","../../src/actions/datalake/payloads/tailPayloads.ts","../../src/commands/datalakeFetchCommand.ts","../../src/commands/datalakeGrantCommand.ts","../../src/commands/datalakeListCommand.ts","../../src/commands/datalakeLoginCommand.ts","../../src/commands/datalakeLogoutCommand.ts","../../src/commands/datalakePushCommand.ts","../../src/commands/datalakeRevokeCommand.ts","../../src/commands/datalakeTailCommand.ts","../../src/commands/datalakeTokenCommand.ts","../../src/commands/datalakeUseCommand.ts","../../src/commands/datalakeCommand.ts"],"sourcesContent":["import { spawn } from 'node:child_process'\nimport {\n createReadStream, existsSync, readdirSync, statSync, unlinkSync,\n} from 'node:fs'\nimport path from 'node:path'\nimport { createInterface } from 'node:readline'\n\nimport { createDatalakeClient, type DatalakeClient } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport { getDevDir } from '../dev/paths.ts'\n\nexport interface AuditEntry {\n time: string\n requestId: string\n method: string\n path: string\n datalakeId?: string\n subject: string\n authenticated: boolean\n statusCode: number\n durationMs: number\n ip: string\n}\n\nexport interface AuditOptions {\n /**\n * Override the audit source. Pass a file to read one log, a directory to\n * scan a rotation set, or omit entirely to auto-detect between\n * `<home>/dev/audit.log` (single file) and `<home>/dev/audit/` (rotating).\n */\n file?: string\n /** Follow mode — stream new lines as they arrive. */\n follow?: boolean\n /** Max rows to print (when not following). Default 50. */\n lines?: number\n /** Filter by datalake id or name (resolves name via control plane). */\n datalake?: string\n /** Filter by status code prefix (e.g. `4` matches 4xx). */\n status?: string\n /** Filter by HTTP method. */\n method?: string\n /** Filter: only authenticated, only anonymous, or both. */\n authenticated?: 'true' | 'false'\n /** Regex applied to the raw JSON line. */\n grep?: string\n}\n\nexport interface PurgeAuditOptions {\n /** Directory of rotated files. Defaults to `<home>/dev/audit/`. */\n directory?: string\n /** Drop any file older than this many days. Required. */\n maxAgeDays: number\n /** Don't delete, just report. */\n dryRun?: boolean\n}\n\ninterface ResolvedFilters {\n datalakeId?: string\n statusPrefix?: string\n method?: string\n authenticated?: boolean\n grepRegex?: RegExp\n}\n\ninterface ResolvedSource {\n /** Files to read, in chronological order (oldest → newest). */\n files: string[]\n /** File to tail in follow mode (always the newest). */\n tailFile: string\n /** Human-readable description for error messages. */\n description: string\n}\n\nconst AUDIT_FILE_PATTERN = /^audit-\\d{4}-\\d{2}-\\d{2}\\.log$/\n\nfunction defaultSingleFile(): string {\n return path.join(getDevDir(), 'audit.log')\n}\n\nfunction defaultRotationDir(): string {\n return path.join(getDevDir(), 'audit')\n}\n\nfunction listRotatedFiles(directory: string): string[] {\n if (!existsSync(directory)) return []\n return readdirSync(directory)\n .filter(file => AUDIT_FILE_PATTERN.test(file))\n .toSorted()\n .map(file => path.join(directory, file))\n}\n\nfunction resolveSource(override: string | undefined): ResolvedSource | undefined {\n if (override) {\n if (!existsSync(override)) return undefined\n const stat = statSync(override)\n if (stat.isDirectory()) {\n const files = listRotatedFiles(override)\n if (files.length === 0) return undefined\n return {\n files, tailFile: files.at(-1)!, description: override,\n }\n }\n return {\n files: [override], tailFile: override, description: override,\n }\n }\n const single = defaultSingleFile()\n if (existsSync(single)) {\n return {\n files: [single], tailFile: single, description: single,\n }\n }\n const rotDir = defaultRotationDir()\n const files = listRotatedFiles(rotDir)\n if (files.length === 0) return undefined\n return {\n files, tailFile: files.at(-1)!, description: rotDir,\n }\n}\n\nasync function resolveDatalakeId(target: string): Promise<string> {\n if (target.startsWith('dl_')) return target\n const client: DatalakeClient = createDatalakeClient()\n const descriptor = await client.describe(target)\n return descriptor.id\n}\n\nasync function buildFilters(options: AuditOptions): Promise<ResolvedFilters> {\n return {\n datalakeId: options.datalake ? await resolveDatalakeId(options.datalake) : undefined,\n statusPrefix: options.status,\n method: options.method?.toUpperCase(),\n authenticated: options.authenticated === undefined ? undefined : options.authenticated === 'true',\n grepRegex: options.grep ? new RegExp(options.grep) : undefined,\n }\n}\n\nfunction matchesFilters(line: string, entry: AuditEntry, filters: ResolvedFilters): boolean {\n if (filters.datalakeId && entry.datalakeId !== filters.datalakeId) return false\n if (filters.statusPrefix && !String(entry.statusCode).startsWith(filters.statusPrefix)) return false\n if (filters.method && entry.method !== filters.method) return false\n if (filters.authenticated !== undefined && entry.authenticated !== filters.authenticated) return false\n if (filters.grepRegex && !filters.grepRegex.test(line)) return false\n return true\n}\n\nfunction formatEntry(entry: AuditEntry): string {\n const when = entry.time.slice(11, 19)\n const status = entry.statusCode >= 500\n ? chalk.red(String(entry.statusCode))\n : entry.statusCode >= 400\n ? chalk.yellow(String(entry.statusCode))\n : chalk.green(String(entry.statusCode))\n const subject = entry.authenticated ? chalk.magenta(entry.subject) : chalk.gray(entry.subject)\n const duration = chalk.gray(`${entry.durationMs}ms`)\n return `${chalk.gray(when)} ${status} ${entry.method.padEnd(6)} ${entry.path} ${subject} ${duration}`\n}\n\nfunction parseLine(line: string): AuditEntry | undefined {\n try {\n return JSON.parse(line) as AuditEntry\n } catch {\n return undefined\n }\n}\n\nexport async function auditLog(options: AuditOptions = {}): Promise<void> {\n const source = resolveSource(options.file)\n if (!source) {\n const location = options.file ?? `${defaultSingleFile()} or ${defaultRotationDir()}`\n console.log(chalk.yellow(`no audit log at ${location}`))\n console.log(chalk.gray('enable with `aries datalake dev up --audit` (or --audit --audit-rotate)'))\n process.exitCode = 3\n return\n }\n\n const filters = await buildFilters(options)\n\n if (options.follow) {\n await followLog(source.tailFile, filters, options.lines ?? 0)\n return\n }\n\n await dumpTail(source.files, filters, options.lines ?? 50)\n}\n\nasync function dumpTail(files: string[], filters: ResolvedFilters, limit: number): Promise<void> {\n // Ring-buffer across all files in chronological order; retain last N matches.\n const ring: string[] = []\n for (const filePath of files) {\n const stream = createReadStream(filePath, { encoding: 'utf8' })\n const rl = createInterface({ input: stream, crlfDelay: Infinity })\n for await (const line of rl) {\n if (!line.trim()) continue\n const entry = parseLine(line)\n if (!entry) continue\n if (!matchesFilters(line, entry, filters)) continue\n ring.push(formatEntry(entry))\n if (ring.length > limit) ring.shift()\n }\n }\n for (const row of ring) console.log(row)\n}\n\nasync function followLog(filePath: string, filters: ResolvedFilters, initialLines: number): Promise<void> {\n if (initialLines > 0) {\n await dumpTail([filePath], filters, initialLines)\n }\n const startOffset = statSync(filePath).size\n const child = spawn('tail', ['-f', '-c', '+0', filePath], { stdio: ['ignore', 'pipe', 'inherit'] })\n child.stdout.setEncoding('utf8')\n let buffer = ''\n let bytesSeen = 0\n child.stdout.on('data', (chunk: string) => {\n bytesSeen += Buffer.byteLength(chunk, 'utf8')\n buffer += chunk\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n if (bytesSeen < startOffset) return\n for (const line of lines) {\n if (!line.trim()) continue\n const entry = parseLine(line)\n if (!entry) continue\n if (!matchesFilters(line, entry, filters)) continue\n console.log(formatEntry(entry))\n }\n })\n await new Promise<void>((resolve) => {\n child.on('exit', (code) => {\n process.exitCode = code ?? 0\n resolve()\n })\n })\n}\n\n/**\n * Prunes rotated audit files older than `maxAgeDays`. Returns the list of\n * removed file paths (or the would-be-removed list when `dryRun=true`).\n */\nexport function purgeAuditLog(options: PurgeAuditOptions): string[] {\n const directory = options.directory ?? defaultRotationDir()\n if (!existsSync(directory)) return []\n const cutoff = Date.now() - options.maxAgeDays * 86_400_000\n const removed: string[] = []\n for (const file of readdirSync(directory)) {\n if (!AUDIT_FILE_PATTERN.test(file)) continue\n const fullPath = path.join(directory, file)\n const stat = statSync(fullPath)\n if (stat.mtimeMs >= cutoff) continue\n if (!options.dryRun) unlinkSync(fullPath)\n removed.push(fullPath)\n }\n return removed\n}\n","import { homedir } from 'node:os'\nimport path from 'node:path'\n\nfunction getAriesHome(): string {\n return process.env.ARIES_HOME ?? path.join(homedir(), '.aries')\n}\n\nexport function getDevDir(): string {\n return path.join(getAriesHome(), 'dev')\n}\n\nexport function getDevStatePath(): string {\n return path.join(getDevDir(), 'state.json')\n}\n\nexport function getDevPidPath(): string {\n return path.join(getDevDir(), 'pid')\n}\n\nexport function getDevLogPath(): string {\n return path.join(getDevDir(), 'server.log')\n}\n","import type { CommandModule } from 'yargs'\n\nimport { auditLog, purgeAuditLog } from '../actions/datalake/audit/auditLog.ts'\n\nconst viewCommand: CommandModule = {\n command: ['view', '$0'],\n describe: 'Print audit log rows (default)',\n builder: yargs =>\n yargs\n .option('follow', {\n alias: 'f',\n type: 'boolean',\n default: false,\n describe: 'Stream new rows as they arrive (tails the most recent file)',\n })\n .option('lines', {\n alias: 'n',\n type: 'number',\n default: 50,\n describe: 'Tail this many rows (0 = start fresh in --follow mode)',\n })\n .option('datalake', {\n alias: 'd',\n type: 'string',\n describe: 'Filter by datalake name or id',\n })\n .option('status', {\n type: 'string',\n describe: 'Status code prefix filter (e.g. 4 matches 4xx)',\n })\n .option('method', {\n type: 'string',\n describe: 'HTTP method filter (GET, POST, etc.)',\n })\n .option('authenticated', {\n type: 'string',\n choices: ['true', 'false'] as const,\n describe: 'Show only authenticated or only anonymous requests',\n })\n .option('grep', {\n type: 'string',\n describe: 'Regex pattern applied to the raw JSON line',\n })\n .option('file', {\n type: 'string',\n describe: 'File or directory (auto-detects rotation layout)',\n }),\n handler: async (argv) => {\n await auditLog({\n follow: argv.follow as boolean,\n lines: argv.lines as number,\n datalake: argv.datalake as string | undefined,\n status: argv.status as string | undefined,\n method: argv.method as string | undefined,\n authenticated: argv.authenticated as 'true' | 'false' | undefined,\n grep: argv.grep as string | undefined,\n file: argv.file as string | undefined,\n })\n },\n}\n\nconst purgeCommand: CommandModule = {\n command: 'purge',\n describe: 'Delete rotated audit files older than --max-age-days',\n builder: yargs =>\n yargs\n .option('max-age-days', {\n type: 'number',\n demandOption: true,\n describe: 'Retention window; files older than this are deleted',\n })\n .option('directory', {\n type: 'string',\n describe: 'Rotation directory (defaults to <ARIES_HOME>/dev/audit)',\n })\n .option('dry-run', {\n type: 'boolean',\n default: false,\n describe: 'Report what would be deleted without removing anything',\n }),\n handler: (argv) => {\n const removed = purgeAuditLog({\n maxAgeDays: argv['max-age-days'] as number,\n directory: argv.directory as string | undefined,\n dryRun: argv['dry-run'] as boolean,\n })\n const verb = argv['dry-run'] ? 'would remove' : 'removed'\n console.log(`${verb} ${removed.length} file(s):`)\n for (const file of removed) console.log(` ${file}`)\n },\n}\n\nexport const datalakeAuditCommand: CommandModule = {\n command: 'audit',\n describe: 'Inspect or prune the data-plane audit log (dev server)',\n builder: yargs =>\n yargs\n .command(viewCommand)\n .command(purgeCommand),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n handler: () => {},\n}\n","import type { DatalakeRegion, DatalakeTier } from '@xylabs/aries-datalake-core'\nimport { DATALAKE_REGIONS, DATALAKE_TIERS } from '@xylabs/aries-datalake-core'\nimport type { CommandModule } from 'yargs'\n\nimport { createDatalake } from '../actions/datalake/index.ts'\n\nexport const datalakeCreateCommand: CommandModule = {\n command: 'create <name>',\n describe: 'Provision a new datalake',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Human-friendly name (unique per owner)',\n demandOption: true,\n })\n .option('tier', {\n alias: 't',\n type: 'string',\n choices: DATALAKE_TIERS,\n default: 'small',\n describe: 'Service tier',\n })\n .option('size', {\n alias: 's',\n type: 'string',\n describe: 'Capacity (e.g. 10GB, 100GB, 1TB)',\n })\n .option('iops', {\n type: 'number',\n describe: 'Provisioned IOPS target',\n })\n .option('region', {\n alias: 'r',\n type: 'string',\n choices: DATALAKE_REGIONS,\n describe: 'Deployment region',\n })\n .option('retention-days', {\n type: 'number',\n describe: 'Retention in days (omit for tier default)',\n })\n .option('verify-hashes', {\n type: 'boolean',\n default: false,\n describe: 'Reject inserts whose $hash does not match the content digest',\n })\n .option('rate-auth-per-minute', {\n type: 'number',\n describe: 'Override: authenticated requests per minute',\n })\n .option('rate-anon-per-minute', {\n type: 'number',\n describe: 'Override: anonymous requests per minute',\n })\n .option('rate-burst-factor', {\n type: 'number',\n describe: 'Override: rate-limit burst factor (1 = no burst)',\n }),\n handler: async (argv) => {\n await createDatalake({\n name: argv.name as string,\n tier: argv.tier as DatalakeTier,\n size: argv.size as string | undefined,\n iops: argv.iops as number | undefined,\n region: argv.region as DatalakeRegion | undefined,\n retentionDays: argv['retention-days'] as number | undefined,\n verifyHashes: argv['verify-hashes'] as boolean,\n rateAuthPerMinute: argv['rate-auth-per-minute'] as number | undefined,\n rateAnonPerMinute: argv['rate-anon-per-minute'] as number | undefined,\n rateBurstFactor: argv['rate-burst-factor'] as number | undefined,\n })\n },\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport type {\n DatalakeConfig, DatalakeRegion, DatalakeTier, RateLimitOverrides,\n} from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { printDatalakeDetail } from './formatters.ts'\nimport { parseSize } from './parseSize.ts'\n\nexport interface CreateDatalakeOptions {\n name: string\n tier: DatalakeTier\n size?: string\n iops?: number\n region?: DatalakeRegion\n retentionDays?: number\n verifyHashes?: boolean\n rateAuthPerMinute?: number\n rateAnonPerMinute?: number\n rateBurstFactor?: number\n}\n\nfunction buildRateLimits(options: CreateDatalakeOptions): RateLimitOverrides | undefined {\n if (\n options.rateAuthPerMinute === undefined\n && options.rateAnonPerMinute === undefined\n && options.rateBurstFactor === undefined\n ) return undefined\n return {\n authenticatedPerMinute: options.rateAuthPerMinute,\n anonymousPerMinute: options.rateAnonPerMinute,\n burstFactor: options.rateBurstFactor,\n }\n}\n\nexport async function createDatalake(options: CreateDatalakeOptions): Promise<void> {\n const client = createDatalakeClient()\n const config: DatalakeConfig = {\n tier: options.tier,\n sizeBytes: options.size === undefined ? undefined : parseSize(options.size),\n iops: options.iops,\n region: options.region,\n retentionDays: options.retentionDays,\n verifyHashes: options.verifyHashes,\n rateLimits: buildRateLimits(options),\n }\n\n console.log(chalk.gray(`provisioning ${options.name} (tier=${options.tier})...`))\n const descriptor = await client.create({ name: options.name, config })\n console.log(chalk.green(`created ${descriptor.name} (${descriptor.id})`))\n printDatalakeDetail(descriptor)\n}\n","import type {\n DatalakeDescriptor, DatalakeStatus, DatalakeUsage, RateLimitOverrides,\n} from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nconst STATUS_COLORS: Record<DatalakeStatus, (s: string) => string> = {\n pending: chalk.gray,\n provisioning: chalk.yellow,\n ready: chalk.green,\n resizing: chalk.yellow,\n deprovisioning: chalk.yellow,\n deleted: chalk.gray,\n error: chalk.red,\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`\n if (bytes < 1024 ** 4) return `${(bytes / 1024 ** 3).toFixed(1)} GB`\n return `${(bytes / 1024 ** 4).toFixed(1)} TB`\n}\n\nexport function formatStatus(status: DatalakeStatus): string {\n const colorize = STATUS_COLORS[status] ?? chalk.white\n return colorize(status)\n}\n\nexport function printDatalakeRow(datalake: DatalakeDescriptor): void {\n const size = datalake.config.sizeBytes ? formatBytes(datalake.config.sizeBytes) : '—'\n const name = chalk.white(datalake.name.padEnd(20))\n const tier = chalk.cyan(datalake.config.tier.padEnd(8))\n const region = chalk.gray((datalake.config.region ?? '—').padEnd(12))\n const status = formatStatus(datalake.status).padEnd(14)\n console.log(` ${name} ${tier} ${region} ${size.padStart(8)} ${status}`)\n}\n\nfunction printRateLimits(limits: RateLimitOverrides): void {\n const parts: string[] = []\n if (limits.authenticatedPerMinute !== undefined) parts.push(`auth=${limits.authenticatedPerMinute}/min`)\n if (limits.anonymousPerMinute !== undefined) parts.push(`anon=${limits.anonymousPerMinute}/min`)\n if (limits.burstFactor !== undefined) parts.push(`burst=${limits.burstFactor}x`)\n if (parts.length > 0) {\n console.log(` ${chalk.gray('limits:')} ${parts.join(' ')}`)\n }\n}\n\nfunction printUsage(usage: DatalakeUsage): void {\n console.log()\n console.log(chalk.cyan(' usage'))\n console.log(` ${chalk.gray('payloads:')} ${usage.payloadCount}`)\n console.log(` ${chalk.gray('stored:')} ${formatBytes(usage.bytesStored)} / ${formatBytes(usage.bytesStoredLimit)}`)\n console.log(` ${chalk.gray('reads 24h:')} ${usage.readsLast24h}`)\n console.log(` ${chalk.gray('writes 24h:')} ${usage.writesLast24h}`)\n}\n\nfunction printAcl(acl: DatalakeDescriptor['acl']): void {\n if (acl.length === 0) return\n console.log()\n console.log(chalk.cyan(' access'))\n for (const entry of acl) {\n const principal = entry.principal === 'public' ? chalk.yellow('public') : entry.principal\n console.log(` ${principal.padEnd(24)} ${chalk.magenta(entry.role)} ${chalk.gray(entry.grantedAt)}`)\n }\n}\n\nexport function printDatalakeDetail(datalake: DatalakeDescriptor): void {\n console.log(chalk.cyan(`\\n${datalake.name}`))\n console.log(` ${chalk.gray('id:')} ${datalake.id}`)\n console.log(` ${chalk.gray('status:')} ${formatStatus(datalake.status)}`)\n if (datalake.url) {\n console.log(` ${chalk.gray('url:')} ${datalake.url}`)\n }\n console.log(` ${chalk.gray('owner:')} ${datalake.ownerId}`)\n console.log(` ${chalk.gray('tier:')} ${datalake.config.tier}`)\n console.log(` ${chalk.gray('region:')} ${datalake.config.region ?? '—'}`)\n console.log(` ${chalk.gray('size:')} ${datalake.config.sizeBytes ? formatBytes(datalake.config.sizeBytes) : '—'}`)\n console.log(` ${chalk.gray('iops:')} ${datalake.config.iops ?? '—'}`)\n console.log(` ${chalk.gray('retention:')} ${datalake.config.retentionDays ?? 'forever'}`)\n if (datalake.config.verifyHashes) {\n console.log(` ${chalk.gray('verify:')} ${chalk.green('hashes enforced')}`)\n }\n if (datalake.config.rateLimits) printRateLimits(datalake.config.rateLimits)\n console.log(` ${chalk.gray('created:')} ${datalake.createdAt}`)\n console.log(` ${chalk.gray('updated:')} ${datalake.updatedAt}`)\n if (datalake.usage) printUsage(datalake.usage)\n printAcl(datalake.acl)\n if (datalake.errorMessage) {\n console.log()\n console.log(` ${chalk.red('error:')} ${datalake.errorMessage}`)\n }\n}\n","const SIZE_UNITS: Record<string, number> = {\n b: 1,\n kb: 1024,\n mb: 1024 ** 2,\n gb: 1024 ** 3,\n tb: 1024 ** 4,\n}\n\n/**\n * Parse human-readable sizes like \"10GB\", \"500MB\", \"1tb\" into bytes.\n * Throws on unrecognized input so the CLI surfaces a clear error.\n */\nexport function parseSize(input: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)\\s*([a-zA-Z]+)?$/.exec(input.trim())\n if (!match) throw new Error(`Invalid size: ${input}`)\n const value = Number(match[1])\n const unitRaw = (match[2] ?? 'b').toLowerCase()\n const unit = SIZE_UNITS[unitRaw]\n if (unit === undefined) throw new Error(`Unknown size unit: ${match[2]}`)\n return Math.round(value * unit)\n}\n","import type { DatalakeUsageReport } from '@xylabs/aries-datalake-client'\nimport { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport { printDatalakeDetail } from './formatters.ts'\nimport { mintAndConnect } from './payloads/mintAndConnect.ts'\nimport { resolveTarget } from './resolveTarget.ts'\n\nexport async function describeDatalake(idOrName: string | undefined): Promise<void> {\n const client = createDatalakeClient()\n const target = resolveTarget(idOrName)\n const descriptor = await client.describe(target)\n printDatalakeDetail(descriptor)\n\n if (descriptor.status !== 'ready') return\n\n // Best-effort live-quota probe against the data plane. Requires a viewer\n // token from the control plane; any failure is surfaced as a note, not\n // an error — `describe` still works without the data plane reachable.\n try {\n const connection = await mintAndConnect({ idOrName: target, role: 'viewer' })\n const usage = await connection.client.usage()\n printLiveUsage(usage)\n } catch (error) {\n console.log()\n console.log(chalk.gray(\n ` (live quota unavailable: ${error instanceof Error ? error.message : String(error)})`,\n ))\n }\n}\n\nfunction printLiveUsage(usage: DatalakeUsageReport): void {\n console.log()\n console.log(chalk.cyan(' live'))\n console.log(` ${chalk.gray('payloads:')} ${usage.payloadCount}`)\n const limits = usage.rateLimits\n if (limits?.authenticated) {\n const { remaining, limit } = limits.authenticated\n console.log(` ${chalk.gray('auth quota:')} ${remaining}/${limit}`)\n }\n if (limits?.anonymous) {\n const { remaining, limit } = limits.anonymous\n console.log(` ${chalk.gray('anon quota:')} ${remaining}/${limit}`)\n }\n}\n","import type { PayloadsClient } from '@xylabs/aries-datalake-client'\nimport { createDatalakeClient, RestPayloadsClient } from '@xylabs/aries-datalake-client'\nimport type { DatalakeRole } from '@xylabs/aries-datalake-core'\nimport { XyoPayloadsClient } from '@xylabs/aries-datalake-xl1-adapter'\n\nimport { resolveTarget } from '../resolveTarget.ts'\n\nexport interface Connection {\n client: PayloadsClient\n datalakeName: string\n datalakeId: string\n url: string\n transport: 'native' | 'xl1-sdk'\n}\n\nexport interface MintAndConnectOptions {\n idOrName?: string\n role: DatalakeRole\n ttlSeconds?: number\n /**\n * When `true`, use the real `@xyo-network/xl1-protocol-sdk`\n * `RestDataLakeRunner` / `RestDataLakeViewer` for insert and get,\n * proving byte-level wire compatibility. Other methods fall back to the\n * native `RestPayloadsClient` since the XL1 SDK doesn't implement them.\n */\n useXl1Sdk?: boolean\n}\n\n/**\n * Resolves the target datalake, mints a scoped token via the control plane,\n * and returns a data-plane client wired with that token. Centralizes what\n * every payload command has to do before it can talk to the data plane.\n */\nexport async function mintAndConnect(options: MintAndConnectOptions): Promise<Connection> {\n const controlClient = createDatalakeClient()\n const target = resolveTarget(options.idOrName)\n const descriptor = await controlClient.describe(target)\n if (!descriptor.url) {\n throw new Error(`Datalake ${descriptor.name} has no URL yet (status=${descriptor.status})`)\n }\n const token = await controlClient.mintToken({\n datalakeId: descriptor.id,\n role: options.role,\n ttlSeconds: options.ttlSeconds ?? 3600,\n })\n const clientOptions = {\n baseUrl: token.url,\n datalakeId: descriptor.id,\n authToken: token.token,\n }\n return {\n client: options.useXl1Sdk\n ? new XyoPayloadsClient(clientOptions)\n : new RestPayloadsClient(clientOptions),\n datalakeName: descriptor.name,\n datalakeId: descriptor.id,\n url: token.url,\n transport: options.useXl1Sdk ? 'xl1-sdk' : 'native',\n }\n}\n","import { getDefaultDatalake } from '@xylabs/aries-datalake-client'\n\n/**\n * Resolves the target datalake name/id for commands that take an optional\n * argument. Falls back to the one set via `aries datalake use`.\n */\nexport function resolveTarget(argValue: string | undefined): string {\n const target = argValue ?? getDefaultDatalake()\n if (!target) {\n throw new Error(\n 'No datalake specified and no default set. '\n + 'Pass <name> or run `aries datalake use <name>`.',\n )\n }\n return target\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport { resolveTarget } from './resolveTarget.ts'\n\nexport interface DestroyDatalakeOptions {\n idOrName?: string\n force?: boolean\n}\n\nexport async function destroyDatalake(options: DestroyDatalakeOptions): Promise<void> {\n const client = createDatalakeClient()\n const target = resolveTarget(options.idOrName)\n\n if (!options.force) {\n console.log(chalk.yellow(\n `Refusing to destroy ${target} without --force. `\n + 'This operation permanently deletes the datalake and all its payloads.',\n ))\n process.exitCode = 1\n return\n }\n\n await client.destroy(target)\n console.log(chalk.green(`destroyed ${target}`))\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport type { DatalakePrincipal, DatalakeRole } from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { printDatalakeDetail } from './formatters.ts'\nimport { resolveTarget } from './resolveTarget.ts'\n\nexport interface GrantAccessOptions {\n idOrName?: string\n principal: DatalakePrincipal\n role: DatalakeRole\n confirmPublic?: boolean\n}\n\nexport async function grantAccess(options: GrantAccessOptions): Promise<void> {\n const client = createDatalakeClient()\n const target = resolveTarget(options.idOrName)\n\n if (options.principal === 'public' && options.role === 'runner' && !options.confirmPublic) {\n console.log(chalk.yellow(\n 'Granting `public runner` makes anonymous writes possible. '\n + 'Re-run with --confirm-public to proceed.',\n ))\n process.exitCode = 1\n return\n }\n\n const descriptor = await client.describe(target)\n const updated = await client.grant({\n datalakeId: descriptor.id,\n principal: options.principal,\n role: options.role,\n })\n console.log(chalk.green(`granted ${options.role} to ${options.principal} on ${updated.name}`))\n printDatalakeDetail(updated)\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport { printDatalakeRow } from './formatters.ts'\n\nexport async function listDatalakes(): Promise<void> {\n const client = createDatalakeClient()\n const datalakes = await client.list()\n\n if (datalakes.length === 0) {\n console.log(chalk.yellow('No datalakes yet. Create one with `aries datalake create <name>`.'))\n return\n }\n\n console.log(\n chalk.gray(' ')\n + chalk.gray('name'.padEnd(20))\n + ' '\n + chalk.gray('tier'.padEnd(8))\n + ' '\n + chalk.gray('region'.padEnd(12))\n + ' '\n + chalk.gray(' size')\n + ' '\n + chalk.gray('status'),\n )\n for (const datalake of datalakes) {\n printDatalakeRow(datalake)\n }\n}\n","import { saveCredentials } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nexport interface LoginOptions {\n baseUrl?: string\n token?: string\n}\n\n/**\n * P0 stub: accepts a pre-issued token + base URL and writes credentials to\n * disk. The real OAuth device-flow ships in P1 alongside the control plane.\n */\nexport async function login(options: LoginOptions): Promise<void> {\n const baseUrl = options.baseUrl ?? process.env.ARIES_DATALAKE_API\n const token = options.token ?? process.env.ARIES_DATALAKE_TOKEN\n\n if (!baseUrl || !token) {\n console.log(chalk.yellow(\n 'P0 login requires --base-url and --token (or ARIES_DATALAKE_API + ARIES_DATALAKE_TOKEN). '\n + 'OAuth device-flow lands in P1.',\n ))\n process.exitCode = 1\n return\n }\n\n saveCredentials({ baseUrl, authToken: token })\n console.log(chalk.green(`credentials saved for ${baseUrl}`))\n}\n","import { clearCredentials } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nexport async function logout(): Promise<void> {\n clearCredentials()\n console.log(chalk.green('signed out'))\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport type { DatalakeRole } from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { resolveTarget } from './resolveTarget.ts'\n\nexport interface MintTokenOptions {\n idOrName?: string\n role: DatalakeRole\n ttlSeconds?: number\n}\n\nexport async function mintToken(options: MintTokenOptions): Promise<void> {\n const client = createDatalakeClient()\n const target = resolveTarget(options.idOrName)\n const descriptor = await client.describe(target)\n const token = await client.mintToken({\n datalakeId: descriptor.id,\n role: options.role,\n ttlSeconds: options.ttlSeconds,\n })\n\n console.log(chalk.cyan('datalake token'))\n console.log(` ${chalk.gray('url:')} ${token.url}`)\n console.log(` ${chalk.gray('role:')} ${token.role}`)\n console.log(` ${chalk.gray('exp:')} ${token.expiresAt}`)\n console.log()\n console.log(token.token)\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport type { DatalakePrincipal } from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { printDatalakeDetail } from './formatters.ts'\nimport { resolveTarget } from './resolveTarget.ts'\n\nexport interface RevokeAccessOptions {\n idOrName?: string\n principal: DatalakePrincipal\n}\n\nexport async function revokeAccess(options: RevokeAccessOptions): Promise<void> {\n const client = createDatalakeClient()\n const target = resolveTarget(options.idOrName)\n const descriptor = await client.describe(target)\n const updated = await client.revoke({\n datalakeId: descriptor.id,\n principal: options.principal,\n })\n console.log(chalk.green(`revoked access for ${options.principal} on ${updated.name}`))\n printDatalakeDetail(updated)\n}\n","import {\n clearDefaultDatalake, createDatalakeClient, setDefaultDatalake,\n} from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nexport async function useDatalake(name: string | undefined): Promise<void> {\n if (!name) {\n clearDefaultDatalake()\n console.log(chalk.green('cleared default datalake'))\n return\n }\n\n const client = createDatalakeClient()\n const descriptor = await client.describe(name)\n setDefaultDatalake(descriptor.name, descriptor.id)\n console.log(chalk.green(`default datalake set to ${descriptor.name} (${descriptor.id})`))\n}\n","import type { CommandModule } from 'yargs'\n\nimport { describeDatalake } from '../actions/datalake/index.ts'\n\nexport const datalakeDescribeCommand: CommandModule = {\n command: 'describe [name]',\n describe: 'Show details for a datalake (falls back to the default)',\n builder: yargs =>\n yargs.positional('name', {\n type: 'string',\n describe: 'Datalake name or id',\n }),\n handler: async (argv) => {\n await describeDatalake(argv.name as string | undefined)\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { destroyDatalake } from '../actions/datalake/index.ts'\n\nexport const datalakeDestroyCommand: CommandModule = {\n command: 'destroy [name]',\n describe: 'Permanently delete a datalake',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id',\n })\n .option('force', {\n alias: 'f',\n type: 'boolean',\n default: false,\n describe: 'Required confirmation flag',\n }),\n handler: async (argv) => {\n await destroyDatalake({\n idOrName: argv.name as string | undefined,\n force: argv.force as boolean,\n })\n },\n}\n","import { clearCredentials, loadCredentials } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport {\n clearDevState, isProcessAlive, readDevState,\n} from './state.ts'\n\n/**\n * Stops the dev server spawned by `upDevServer`. Sends SIGTERM, waits up to\n * `gracePeriodMs` for a clean exit, then SIGKILLs if the process is still\n * around. Clears credentials only when they still point at the dev server —\n * we never want to stomp a user's real sign-in.\n */\nexport interface DownDevServerOptions {\n gracePeriodMs?: number\n}\n\nconst DEFAULT_GRACE_MS = 2000\nconst POLL_MS = 50\n\nexport async function downDevServer(options: DownDevServerOptions = {}): Promise<void> {\n const state = readDevState()\n if (!state) {\n console.log(chalk.yellow('dev server is not running'))\n return\n }\n const graceMs = options.gracePeriodMs ?? DEFAULT_GRACE_MS\n\n if (!isProcessAlive(state.pid)) {\n cleanup(state.controlUrl)\n console.log(chalk.green(`dev server pid ${state.pid} was already stopped — cleaned up state`))\n return\n }\n\n try {\n process.kill(state.pid, 'SIGTERM')\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n if (code !== 'ESRCH') throw error\n }\n\n const deadline = Date.now() + graceMs\n while (Date.now() < deadline && isProcessAlive(state.pid)) {\n await delay(POLL_MS)\n }\n if (isProcessAlive(state.pid)) {\n try {\n process.kill(state.pid, 'SIGKILL')\n } catch {\n // best effort\n }\n }\n\n cleanup(state.controlUrl)\n console.log(chalk.green(`dev server pid ${state.pid} stopped`))\n}\n\nfunction cleanup(controlUrl: string): void {\n const credentials = loadCredentials()\n if (credentials?.baseUrl === controlUrl) {\n clearCredentials()\n }\n clearDevState()\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import {\n existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync,\n} from 'node:fs'\n\nimport {\n getDevDir, getDevPidPath, getDevStatePath,\n} from './paths.ts'\n\n/**\n * On-disk bookkeeping for a running dev server. Lives in `~/.aries/dev/` so\n * it survives across CLI invocations and can be queried by `dev status` /\n * `dev logs` / `dev down`.\n */\nexport interface DevState {\n pid: number\n controlUrl: string\n planeUrl: string\n controlPort: number\n planePort: number\n /** User id the dev auth token resolves to on the control plane. */\n userId: string\n /** Bearer token accepted by the dev control plane (written to credentials). */\n authToken: string\n /** Secret the dev control plane HMAC-signs data-plane JWTs with. */\n signingSecret: string\n /** ISO-8601 startup time. */\n startedAt: string\n}\n\nexport function readDevState(): DevState | undefined {\n const filePath = getDevStatePath()\n if (!existsSync(filePath)) return undefined\n try {\n return JSON.parse(readFileSync(filePath, 'utf8')) as DevState\n } catch {\n return undefined\n }\n}\n\nexport function writeDevState(state: DevState): void {\n const dir = getDevDir()\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n writeFileSync(getDevStatePath(), JSON.stringify(state, undefined, 2), 'utf8')\n writeFileSync(getDevPidPath(), String(state.pid), 'utf8')\n}\n\nexport function clearDevState(): void {\n for (const filePath of [getDevStatePath(), getDevPidPath()]) {\n if (existsSync(filePath)) unlinkSync(filePath)\n }\n}\n\n/**\n * Returns true iff the pid is still a live process. `kill(pid, 0)` throws\n * ESRCH when the process doesn't exist and EPERM when it does but we can't\n * signal it — both answer the question we're asking.\n */\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code\n return code === 'EPERM'\n }\n}\n","import { spawn } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport { getDevLogPath } from './paths.ts'\n\nexport interface LogsDevServerOptions {\n follow?: boolean\n /** Number of tail lines to print when not following. */\n lines?: number\n}\n\n/**\n * Streams or dumps the dev server log file. Uses `tail -f` for the follow\n * case so the output stays bounded; for one-shot we read the file and print\n * the last `lines` lines ourselves (portable, no shell subprocess).\n */\nexport async function logsDevServer(options: LogsDevServerOptions = {}): Promise<void> {\n const logPath = getDevLogPath()\n if (!existsSync(logPath)) {\n console.log(chalk.yellow('no dev server log file yet'))\n return\n }\n\n if (options.follow) {\n const child = spawn('tail', ['-n', String(options.lines ?? 50), '-f', logPath], { stdio: 'inherit' })\n await new Promise<void>((resolve) => {\n child.on('exit', (code) => {\n process.exitCode = code ?? 0\n resolve()\n })\n })\n return\n }\n\n const lines = readFileSync(logPath, 'utf8').split('\\n')\n const tail = lines.slice(-(options.lines ?? 50))\n process.stdout.write(tail.join('\\n'))\n if (!tail.at(-1)?.endsWith('\\n')) process.stdout.write('\\n')\n}\n","import { existsSync, rmSync } from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport { downDevServer } from './downDevServer.ts'\nimport { getDevDir } from './paths.ts'\n\n/**\n * Stops the dev server and deletes all dev state. Useful after a crashed\n * server leaves stale sockets or a dirty log file.\n */\nexport async function resetDevServer(): Promise<void> {\n await downDevServer()\n const dir = getDevDir()\n if (!existsSync(dir)) {\n console.log(chalk.green('nothing to reset'))\n return\n }\n rmSync(dir, { recursive: true, force: true })\n console.log(chalk.green(`reset ${dir}`))\n}\n","import chalk from 'chalk'\n\nimport { getDevLogPath } from './paths.ts'\nimport { isProcessAlive, readDevState } from './state.ts'\n\nexport async function statusDevServer(): Promise<void> {\n const state = readDevState()\n if (!state) {\n console.log(chalk.yellow('dev server not running'))\n process.exitCode = 3\n return\n }\n\n const alive = isProcessAlive(state.pid)\n const healthy = alive ? await pingHealth(state.controlUrl) : false\n const uptime = formatUptime(state.startedAt)\n\n console.log(chalk.cyan('dev server status'))\n console.log(` ${chalk.gray('state:')} ${statusLabel(alive, healthy)}`)\n console.log(` ${chalk.gray('pid:')} ${state.pid}`)\n console.log(` ${chalk.gray('control:')} ${state.controlUrl}`)\n console.log(` ${chalk.gray('data:')} ${state.planeUrl}`)\n console.log(` ${chalk.gray('user:')} ${state.userId}`)\n console.log(` ${chalk.gray('started:')} ${state.startedAt}${uptime ? ` (${uptime})` : ''}`)\n console.log(` ${chalk.gray('log:')} ${getDevLogPath()}`)\n\n if (alive && !healthy) {\n process.exitCode = 2\n } else if (!alive) {\n process.exitCode = 3\n }\n}\n\nfunction statusLabel(alive: boolean, healthy: boolean): string {\n if (alive && healthy) return chalk.green('running + healthy')\n if (alive) return chalk.yellow('running but unresponsive')\n return chalk.red('stale state (process gone)')\n}\n\nasync function pingHealth(controlUrl: string): Promise<boolean> {\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 1000)\n const response = await fetch(`${controlUrl}/v1/health`, { signal: controller.signal })\n clearTimeout(timeout)\n return response.ok\n } catch {\n return false\n }\n}\n\nfunction formatUptime(startedAt: string): string {\n const started = new Date(startedAt).getTime()\n if (Number.isNaN(started)) return ''\n const seconds = Math.max(0, Math.floor((Date.now() - started) / 1000))\n if (seconds < 60) return `${seconds}s`\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ${seconds % 60}s`\n const hours = Math.floor(minutes / 60)\n return `${hours}h ${minutes % 60}m`\n}\n","import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport {\n existsSync, mkdirSync, openSync,\n} from 'node:fs'\nimport path from 'node:path'\n\nimport { saveCredentials } from '@xylabs/aries-datalake-client'\nimport chalk from 'chalk'\n\nimport { getDevDir, getDevLogPath } from './paths.ts'\nimport { resolveServerBin } from './resolveServerBin.ts'\nimport {\n clearDevState, type DevState, isProcessAlive, readDevState, writeDevState,\n} from './state.ts'\nimport { waitForHealth } from './waitForHealth.ts'\n\nexport interface UpDevServerOptions {\n controlPort?: number\n planePort?: number\n /** Seconds to wait for the dev server to become healthy. Default 10. */\n timeoutSeconds?: number\n /** Override the bearer token. Default: random hex. */\n authToken?: string\n /** Override the HMAC signing secret. Default: random hex. */\n signingSecret?: string\n /** Override the user id the dev token resolves to. Default: 'dev-user'. */\n userId?: string\n /**\n * Persist the datalake + payload stores to `<ARIES_HOME>/dev/store/` so\n * state survives a `dev down` + `dev up` cycle. Default: false.\n */\n persist?: boolean\n /**\n * Enable the data-plane audit log. When true, every request is appended\n * to `<ARIES_HOME>/dev/audit.log` as JSONL.\n */\n audit?: boolean\n /**\n * Use a rotating directory writer instead of a single file. Files live at\n * `<ARIES_HOME>/dev/audit/audit-YYYY-MM-DD.log`.\n */\n auditRotate?: boolean\n /** Retention window in days when rotation is enabled. */\n auditKeepDays?: number\n}\n\nconst DEFAULT_CONTROL_PORT = 8787\nconst DEFAULT_PLANE_PORT = 8788\nconst DEFAULT_TIMEOUT_SECONDS = 10\n\ninterface ResolvedOptions {\n controlPort: number\n planePort: number\n controlUrl: string\n planeUrl: string\n userId: string\n authToken: string\n signingSecret: string\n timeoutMs: number\n persistDir?: string\n auditLogPath?: string\n auditDir?: string\n auditKeepDays?: number\n}\n\nfunction resolveOptions(options: UpDevServerOptions): ResolvedOptions {\n const controlPort = options.controlPort ?? DEFAULT_CONTROL_PORT\n const planePort = options.planePort ?? DEFAULT_PLANE_PORT\n const rotate = options.auditRotate === true\n return {\n controlPort,\n planePort,\n controlUrl: `http://127.0.0.1:${controlPort}`,\n planeUrl: `http://127.0.0.1:${planePort}`,\n userId: options.userId ?? 'dev-user',\n authToken: options.authToken ?? randomBytes(16).toString('hex'),\n signingSecret: options.signingSecret ?? randomBytes(32).toString('hex'),\n timeoutMs: (options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS) * 1000,\n persistDir: options.persist ? path.join(getDevDir(), 'store') : undefined,\n auditLogPath: options.audit && !rotate ? path.join(getDevDir(), 'audit.log') : undefined,\n auditDir: options.audit && rotate ? path.join(getDevDir(), 'audit') : undefined,\n auditKeepDays: rotate ? options.auditKeepDays : undefined,\n }\n}\n\nfunction spawnDaemon(binPath: string, resolved: ResolvedOptions): ChildProcess {\n const devDir = getDevDir()\n if (!existsSync(devDir)) mkdirSync(devDir, { recursive: true })\n const logFd = openSync(getDevLogPath(), 'a')\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n CONTROL_PORT: String(resolved.controlPort),\n PLANE_PORT: String(resolved.planePort),\n HOST: '127.0.0.1',\n DATALAKE_CONTROL_TOKENS: `${resolved.authToken}=${resolved.userId}`,\n TOKEN_SIGNING_SECRET: resolved.signingSecret,\n DATALAKE_ORIGIN_URL: resolved.planeUrl,\n LOG_LEVEL: process.env.LOG_LEVEL ?? 'info',\n }\n if (resolved.persistDir) env.DATALAKE_PERSIST_DIR = resolved.persistDir\n if (resolved.auditLogPath) env.DATALAKE_AUDIT_LOG = resolved.auditLogPath\n if (resolved.auditDir) env.DATALAKE_AUDIT_DIR = resolved.auditDir\n if (resolved.auditKeepDays !== undefined) env.DATALAKE_AUDIT_MAX_AGE_DAYS = String(resolved.auditKeepDays)\n\n const child = spawn(process.execPath, [binPath], {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n env,\n })\n child.unref()\n return child\n}\n\nfunction describeAudit(resolved: ResolvedOptions): string {\n if (resolved.auditDir) {\n return `rotating ${resolved.auditDir}${resolved.auditKeepDays ? ` (keep ${resolved.auditKeepDays}d)` : ''}`\n }\n return resolved.auditLogPath ?? 'disabled'\n}\n\nfunction printReadyBanner(state: DevState, resolved: ResolvedOptions): void {\n console.log(chalk.green('dev server ready'))\n console.log(` ${chalk.gray('control:')} ${state.controlUrl}`)\n console.log(` ${chalk.gray('data:')} ${state.planeUrl}`)\n console.log(` ${chalk.gray('user:')} ${state.userId}`)\n console.log(` ${chalk.gray('log:')} ${getDevLogPath()}`)\n console.log(` ${chalk.gray('store:')} ${resolved.persistDir ? `persisted (${resolved.persistDir})` : 'in-memory'}`)\n console.log(` ${chalk.gray('audit:')} ${describeAudit(resolved)}`)\n console.log(chalk.gray('\\nCLI is configured — try `aries datalake list`'))\n}\n\nexport async function upDevServer(options: UpDevServerOptions = {}): Promise<DevState> {\n const existing = readDevState()\n if (existing && isProcessAlive(existing.pid)) {\n console.log(chalk.yellow(`dev server already running (pid ${existing.pid}) at ${existing.controlUrl}`))\n return existing\n }\n if (existing) clearDevState()\n\n const resolved = resolveOptions(options)\n const child = spawnDaemon(resolveServerBin(), resolved)\n if (!child.pid) throw new Error('Failed to spawn dev server process')\n\n console.log(chalk.gray(`starting dev server (pid ${child.pid})...`))\n const healthy = await waitForHealth(resolved.controlUrl, resolved.timeoutMs)\n if (!healthy) {\n try {\n process.kill(child.pid, 'SIGTERM')\n } catch {\n // best effort\n }\n throw new Error(\n `Dev server did not become healthy within ${resolved.timeoutMs / 1000}s. `\n + `Check logs at ${getDevLogPath()}`,\n )\n }\n\n const state: DevState = {\n pid: child.pid,\n controlUrl: resolved.controlUrl,\n planeUrl: resolved.planeUrl,\n controlPort: resolved.controlPort,\n planePort: resolved.planePort,\n userId: resolved.userId,\n authToken: resolved.authToken,\n signingSecret: resolved.signingSecret,\n startedAt: new Date().toISOString(),\n }\n writeDevState(state)\n saveCredentials({\n baseUrl: resolved.controlUrl, authToken: resolved.authToken, userId: resolved.userId,\n })\n printReadyBanner(state, resolved)\n return state\n}\n","import { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\n\n// Static type-only import so `deplint` recognizes the package as a declared\n// dependency. The bin path itself is resolved at runtime via `require.resolve`.\nimport type { BuildPlaneOptions as _KeepAsDep } from '@xylabs/aries-datalake-plane'\n\nconst require = createRequire(import.meta.url)\n\n/**\n * Resolves the absolute path to `aries-datalake-dev` (the plane/control dev\n * server binary) from the installed `@xylabs/aries-datalake-plane` package.\n * Throws with an actionable message if the package isn't available — e.g.\n * when someone installs `@xylabs/aries` standalone without the dev server.\n */\nexport function resolveServerBin(): string {\n let packageJsonPath: string\n try {\n packageJsonPath = require.resolve('@xylabs/aries-datalake-plane/package.json')\n } catch {\n throw new Error(\n '@xylabs/aries-datalake-plane is not installed. '\n + 'Install it as a dev dependency to use `aries datalake dev` locally.',\n )\n }\n const binPath = path.join(path.dirname(packageJsonPath), 'dist', 'bin', 'devServer.mjs')\n if (!existsSync(binPath)) {\n throw new Error(\n `Dev server binary not found at ${binPath}. `\n + 'Run `pnpm xy compile` to build it.',\n )\n }\n return binPath\n}\n","const POLL_INTERVAL_MS = 100\n\n/**\n * Polls `GET <baseUrl>/v1/health` until it returns 200 or the timeout\n * expires. Returns `true` on success, `false` on timeout. Callers should\n * kill the daemon on failure; it never came up.\n */\nexport async function waitForHealth(baseUrl: string, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n const url = `${baseUrl.replace(/\\/$/, '')}/v1/health`\n while (Date.now() < deadline) {\n try {\n const response = await fetch(url)\n if (response.ok) return true\n } catch {\n // ECONNREFUSED while the listener is still starting — keep polling.\n }\n await delay(POLL_INTERVAL_MS)\n }\n return false\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import type { CommandModule } from 'yargs'\n\nimport { downDevServer } from '../actions/datalake/dev/index.ts'\n\nexport const datalakeDevDownCommand: CommandModule = {\n command: 'down',\n describe: 'Stop the local dev server (if running) and clear its credentials',\n handler: async () => {\n await downDevServer()\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { logsDevServer } from '../actions/datalake/dev/index.ts'\n\nexport const datalakeDevLogsCommand: CommandModule = {\n command: 'logs',\n describe: 'Print recent dev server log output',\n builder: yargs =>\n yargs\n .option('follow', {\n alias: 'f',\n type: 'boolean',\n default: false,\n describe: 'Stream new lines as they arrive',\n })\n .option('lines', {\n alias: 'n',\n type: 'number',\n default: 50,\n describe: 'Number of tail lines to show',\n }),\n handler: async (argv) => {\n await logsDevServer({\n follow: argv.follow as boolean,\n lines: argv.lines as number,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { resetDevServer } from '../actions/datalake/dev/index.ts'\n\nexport const datalakeDevResetCommand: CommandModule = {\n command: 'reset',\n describe: 'Stop the dev server and wipe all its local state',\n handler: async () => {\n await resetDevServer()\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { statusDevServer } from '../actions/datalake/dev/index.ts'\n\nexport const datalakeDevStatusCommand: CommandModule = {\n command: 'status',\n describe: 'Report whether the local dev server is running and healthy',\n handler: async () => {\n await statusDevServer()\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { upDevServer } from '../actions/datalake/dev/index.ts'\n\nexport const datalakeDevUpCommand: CommandModule = {\n command: 'up',\n describe: 'Start the local control + data plane dev server and wire the CLI to it',\n builder: yargs =>\n yargs\n .option('control-port', {\n type: 'number',\n default: 8787,\n describe: 'Control-plane port',\n })\n .option('plane-port', {\n type: 'number',\n default: 8788,\n describe: 'Data-plane port',\n })\n .option('timeout', {\n type: 'number',\n default: 10,\n describe: 'Seconds to wait for health',\n })\n .option('persist', {\n type: 'boolean',\n default: false,\n describe: 'Persist store state to disk so it survives restarts',\n })\n .option('audit', {\n type: 'boolean',\n default: false,\n describe: 'Write a JSONL audit log of every data-plane request',\n })\n .option('audit-rotate', {\n type: 'boolean',\n default: false,\n describe: 'Rotate the audit log daily (writes to <home>/dev/audit/)',\n })\n .option('audit-keep-days', {\n type: 'number',\n describe: 'Prune rotated audit files older than this many days',\n }),\n handler: async (argv) => {\n await upDevServer({\n controlPort: argv['control-port'] as number,\n planePort: argv['plane-port'] as number,\n timeoutSeconds: argv.timeout as number,\n persist: argv.persist as boolean,\n audit: argv.audit as boolean,\n auditRotate: argv['audit-rotate'] as boolean,\n auditKeepDays: argv['audit-keep-days'] as number | undefined,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { datalakeDevDownCommand } from './datalakeDevDownCommand.ts'\nimport { datalakeDevLogsCommand } from './datalakeDevLogsCommand.ts'\nimport { datalakeDevResetCommand } from './datalakeDevResetCommand.ts'\nimport { datalakeDevStatusCommand } from './datalakeDevStatusCommand.ts'\nimport { datalakeDevUpCommand } from './datalakeDevUpCommand.ts'\n\nexport const datalakeDevCommand: CommandModule = {\n command: 'dev',\n describe: 'Run a local datalake control + data plane for development & testing',\n builder: yargs =>\n yargs\n .command(datalakeDevUpCommand)\n .command(datalakeDevDownCommand)\n .command(datalakeDevStatusCommand)\n .command(datalakeDevLogsCommand)\n .command(datalakeDevResetCommand)\n .demandCommand(1)\n .strictCommands(),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n handler: () => {},\n}\n","import { DatalakeApiError } from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { mintAndConnect } from './mintAndConnect.ts'\n\nexport interface FetchPayloadOptions {\n idOrName?: string\n hash: string\n /** If true, print raw JSON without chalk-formatted header. */\n raw?: boolean\n /** If true, fetch via the real XL1 SDK's `RestDataLakeViewer`. */\n xl1Sdk?: boolean\n}\n\nexport async function fetchPayload(options: FetchPayloadOptions): Promise<void> {\n const connection = await mintAndConnect({\n idOrName: options.idOrName, role: 'viewer', useXl1Sdk: options.xl1Sdk,\n })\n try {\n const payload = await connection.client.get(options.hash)\n if (options.raw) {\n process.stdout.write(`${JSON.stringify(payload)}\\n`)\n return\n }\n console.log(chalk.cyan(`${connection.datalakeName} / ${options.hash}`))\n console.log(JSON.stringify(payload, undefined, 2))\n } catch (error) {\n if (error instanceof DatalakeApiError && error.code === 'not_found') {\n console.log(chalk.yellow(`payload not found: ${options.hash}`))\n process.exitCode = 3\n return\n }\n throw error\n }\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\n\nimport type { Payload } from '@xylabs/aries-datalake-core'\n\n/**\n * Parses a file into an array of payloads. Supports two formats:\n *\n * - `.json`: must be either a top-level array of payloads, or `{ payloads: [...] }`\n * - `.jsonl` / `.ndjson`: one JSON object per line\n *\n * Each payload must have `schema` and `$hash` strings. Invalid rows throw\n * with the line number for JSONL or the array index for JSON.\n */\nexport function parsePayloadsFile(filePath: string): Payload[] {\n const absolute = path.resolve(filePath)\n const raw = readFileSync(absolute, 'utf8')\n const ext = path.extname(absolute).toLowerCase()\n\n if (ext === '.jsonl' || ext === '.ndjson') {\n return parseJsonl(raw)\n }\n if (ext === '.json') {\n return parseJson(raw)\n }\n\n // Fall back on content sniffing — accept JSONL if no `.json` extension.\n const trimmed = raw.trim()\n if (trimmed.startsWith('{') && trimmed.endsWith('}') && trimmed.includes('\\n{')) {\n return parseJsonl(raw)\n }\n return parseJson(raw)\n}\n\nfunction parseJson(raw: string): Payload[] {\n const parsed: unknown = JSON.parse(raw)\n const candidates: unknown[] | undefined = Array.isArray(parsed)\n ? parsed\n : isPayloadsEnvelope(parsed)\n ? parsed.payloads\n : undefined\n if (!candidates) {\n throw new Error('Expected an array of payloads or { \"payloads\": [...] }')\n }\n const result: Payload[] = []\n for (const [index, candidate] of candidates.entries()) {\n validatePayload(candidate, `index ${index}`)\n result.push(candidate)\n }\n return result\n}\n\nfunction parseJsonl(raw: string): Payload[] {\n const lines = raw.split('\\n')\n const payloads: Payload[] = []\n for (const [i, line_] of lines.entries()) {\n const line = line_?.trim()\n if (!line) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new Error(`Line ${i + 1}: invalid JSON (${message})`, { cause: error })\n }\n validatePayload(parsed, `line ${i + 1}`)\n payloads.push(parsed)\n }\n return payloads\n}\n\nfunction isPayloadsEnvelope(value: unknown): value is { payloads: Payload[] } {\n if (typeof value !== 'object' || value === null) return false\n const record = value as Record<string, unknown>\n return Array.isArray(record.payloads)\n}\n\nfunction validatePayload(value: unknown, where: string): asserts value is Payload {\n if (typeof value !== 'object' || value === null) {\n throw new Error(`${where}: not an object`)\n }\n const record = value as Record<string, unknown>\n if (typeof record.schema !== 'string' || record.schema.length === 0) {\n throw new Error(`${where}: missing or invalid \\`schema\\``)\n }\n if (typeof record.$hash !== 'string' || record.$hash.length === 0) {\n throw new Error(`${where}: missing or invalid \\`$hash\\``)\n }\n}\n","import type { Payload } from '@xylabs/aries-datalake-core'\nimport { xyoVerifyPayloadHash } from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { mintAndConnect } from './mintAndConnect.ts'\nimport { parsePayloadsFile } from './parsePayloadsFile.ts'\n\nexport interface PushPayloadsOptions {\n idOrName?: string\n /** Path to a JSON or JSONL file containing payloads. */\n file: string\n /** Max payloads per HTTP request. Data plane caps at 1 000. */\n batchSize?: number\n /**\n * If true, each payload's `$hash` is checked locally against the\n * XL1-canonical content digest before we send. Catches hash/content\n * drift early with a pointer to the exact offending hash.\n */\n verify?: boolean\n /**\n * If true, use the real `@xyo-network/xl1-protocol-sdk`\n * `RestDataLakeRunner` for the upload — exercises the XL1 SDK's exact\n * wire format against our XL1-compat routes.\n */\n xl1Sdk?: boolean\n}\n\nconst DEFAULT_BATCH_SIZE = 500\n\nfunction printRejectedList(label: string, hashes: string[], cap: number, color: (s: string) => string): void {\n console.log(color(label))\n for (const hash of hashes.slice(0, cap)) {\n console.log(` ${hash}`)\n }\n if (hashes.length > cap) {\n console.log(chalk.gray(` ... and ${hashes.length - cap} more`))\n }\n}\n\n/**\n * Returns `true` when every payload's `$hash` matches the XL1-canonical\n * digest. On failure, prints the offending hashes and sets `process.exitCode = 1`.\n */\nasync function verifyLocally(payloads: Payload[]): Promise<boolean> {\n const mismatches: string[] = []\n for (const payload of payloads) {\n if (!(await xyoVerifyPayloadHash(payload))) mismatches.push(payload.$hash)\n }\n if (mismatches.length === 0) {\n console.log(chalk.gray(`verified ${payloads.length} payload hashes locally (XL1-canonical)`))\n return true\n }\n printRejectedList(\n `refusing to push: ${mismatches.length} payload(s) have mismatched $hash`,\n mismatches,\n 10,\n chalk.red,\n )\n process.exitCode = 1\n return false\n}\n\n/**\n * Reads a payloads file and bulk-inserts into the target datalake. Splits\n * into multiple requests if the file exceeds the batch size, reporting\n * cumulative totals.\n */\nexport async function pushPayloads(options: PushPayloadsOptions): Promise<void> {\n const payloads = parsePayloadsFile(options.file)\n if (payloads.length === 0) {\n console.log(chalk.yellow(`${options.file} contained 0 payloads — nothing to push`))\n return\n }\n\n if (options.verify && !(await verifyLocally(payloads))) return\n\n const connection = await mintAndConnect({\n idOrName: options.idOrName, role: 'runner', useXl1Sdk: options.xl1Sdk,\n })\n console.log(chalk.gray(\n `pushing ${payloads.length} payloads to ${connection.datalakeName} `\n + `(${connection.datalakeId}) via ${connection.transport}...`,\n ))\n\n const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE\n let inserted = 0\n let duplicates = 0\n const rejected: string[] = []\n\n for (let offset = 0; offset < payloads.length; offset += batchSize) {\n const batch = payloads.slice(offset, offset + batchSize)\n const result = await connection.client.insert(batch)\n inserted += result.inserted\n duplicates += result.duplicates\n rejected.push(...result.rejected)\n }\n\n console.log(chalk.green(\n `push complete: inserted=${inserted} duplicates=${duplicates} rejected=${rejected.length}`,\n ))\n if (rejected.length > 0) {\n printRejectedList('rejected hashes:', rejected, 20, chalk.yellow)\n }\n}\n","import chalk from 'chalk'\n\nimport { mintAndConnect } from './mintAndConnect.ts'\n\nexport interface TailPayloadsOptions {\n idOrName?: string\n /** Start from the current tail and keep polling for new payloads. */\n follow?: boolean\n /** One-shot page size. Defaults to 50. */\n limit?: number\n /** Start cursor. When following from \"now\", this is the last seen hash. */\n cursor?: string\n /** Schema filter. */\n schemas?: string[]\n /** Poll interval when following, in ms. Defaults to 1 000. */\n pollIntervalMs?: number\n /** Max polls when following. Omit for unlimited. Used in tests. */\n maxPolls?: number\n}\n\nconst DEFAULT_LIMIT = 50\nconst DEFAULT_POLL_MS = 1000\n\n/**\n * Streams payloads from a datalake. In one-shot mode prints the first page.\n * In follow mode pages forward to the end then polls `/next` from the last\n * cursor every `pollIntervalMs`, emitting new payloads as they land.\n */\nexport async function tailPayloads(options: TailPayloadsOptions): Promise<void> {\n const connection = await mintAndConnect({ idOrName: options.idOrName, role: 'viewer' })\n const limit = options.limit ?? DEFAULT_LIMIT\n\n let cursor = options.cursor\n let totalSeen = 0\n\n // Initial page(s): drain forward until we reach end-of-stream. In `follow`\n // mode we print these as backlog; in one-shot mode we stop after one page.\n while (true) {\n const page = await connection.client.next({\n limit, cursor, schemas: options.schemas,\n })\n for (const payload of page.payloads) {\n printPayload(payload)\n totalSeen += 1\n }\n if (!options.follow) {\n if (totalSeen === 0) {\n console.log(chalk.yellow(`${connection.datalakeName}: no payloads yet`))\n }\n return\n }\n if (page.payloads.length < limit) {\n cursor = page.nextCursor ?? cursor\n break\n }\n cursor = page.nextCursor ?? cursor\n }\n\n const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_MS\n console.log(chalk.gray(`following ${connection.datalakeName} (Ctrl+C to stop)`))\n\n let polls = 0\n while (options.maxPolls === undefined || polls < options.maxPolls) {\n await delay(pollIntervalMs)\n polls += 1\n const page = await connection.client.next({\n limit, cursor, schemas: options.schemas,\n })\n for (const payload of page.payloads) {\n printPayload(payload)\n totalSeen += 1\n }\n if (page.nextCursor) cursor = page.nextCursor\n }\n}\n\nfunction printPayload(payload: { $hash: string; schema: string }): void {\n const timestamp = new Date().toISOString()\n console.log(`${chalk.gray(timestamp)} ${chalk.cyan(payload.$hash.slice(0, 12))} ${chalk.magenta(payload.schema)}`)\n console.log(` ${JSON.stringify(payload)}`)\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import type { CommandModule } from 'yargs'\n\nimport { fetchPayload } from '../actions/datalake/payloads/index.ts'\n\nexport const datalakeFetchCommand: CommandModule = {\n command: 'fetch <hash> [name]',\n describe: 'Fetch a single payload by content hash',\n builder: yargs =>\n yargs\n .positional('hash', {\n type: 'string',\n describe: 'Content hash of the payload to fetch',\n demandOption: true,\n })\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id (defaults to current)',\n })\n .option('raw', {\n type: 'boolean',\n default: false,\n describe: 'Print only the raw JSON payload (no header)',\n })\n .option('xl1-sdk', {\n type: 'boolean',\n default: false,\n describe: 'Use the real @xyo-network/xl1-protocol-sdk RestDataLakeViewer',\n }),\n handler: async (argv) => {\n await fetchPayload({\n hash: argv.hash as string,\n idOrName: argv.name as string | undefined,\n raw: argv.raw as boolean,\n xl1Sdk: argv['xl1-sdk'] as boolean,\n })\n },\n}\n","import type { DatalakeRole } from '@xylabs/aries-datalake-core'\nimport type { CommandModule } from 'yargs'\n\nimport { grantAccess } from '../actions/datalake/index.ts'\n\nexport const datalakeGrantCommand: CommandModule = {\n command: 'grant <name> <principal>',\n describe: 'Grant a role on a datalake (principal=user-id or \"public\")',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id',\n demandOption: true,\n })\n .positional('principal', {\n type: 'string',\n describe: 'User id, or the literal \"public\"',\n demandOption: true,\n })\n .option('role', {\n alias: 'r',\n type: 'string',\n choices: ['viewer', 'runner'] as const,\n default: 'viewer',\n describe: 'Role to grant',\n })\n .option('confirm-public', {\n type: 'boolean',\n default: false,\n describe: 'Required to grant `public runner` (anonymous writes)',\n }),\n handler: async (argv) => {\n await grantAccess({\n idOrName: argv.name as string,\n principal: argv.principal as string,\n role: argv.role as DatalakeRole,\n confirmPublic: argv['confirm-public'] as boolean,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { listDatalakes } from '../actions/datalake/index.ts'\n\nexport const datalakeListCommand: CommandModule = {\n command: 'list',\n describe: 'List your datalakes',\n handler: async () => {\n await listDatalakes()\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { login } from '../actions/datalake/index.ts'\n\nexport const datalakeLoginCommand: CommandModule = {\n command: 'login',\n describe: 'Sign in to the datalake control plane',\n builder: yargs =>\n yargs\n .option('base-url', {\n type: 'string',\n describe: 'Control-plane base URL (P0: required)',\n })\n .option('token', {\n type: 'string',\n describe: 'Pre-issued auth token (P0: required; OAuth lands in P1)',\n }),\n handler: async (argv) => {\n await login({\n baseUrl: argv['base-url'] as string | undefined,\n token: argv.token as string | undefined,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { logout } from '../actions/datalake/index.ts'\n\nexport const datalakeLogoutCommand: CommandModule = {\n command: 'logout',\n describe: 'Clear stored datalake credentials',\n handler: async () => {\n await logout()\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { pushPayloads } from '../actions/datalake/payloads/index.ts'\n\nexport const datalakePushCommand: CommandModule = {\n command: 'push <file> [name]',\n describe: 'Insert payloads from a JSON or JSONL file into a datalake',\n builder: yargs =>\n yargs\n .positional('file', {\n type: 'string',\n describe: 'Path to a .json (array) or .jsonl (one payload per line) file',\n demandOption: true,\n })\n .positional('name', {\n type: 'string',\n describe: 'Target datalake name or id (defaults to current)',\n })\n .option('batch-size', {\n type: 'number',\n default: 500,\n describe: 'Max payloads per HTTP request',\n })\n .option('verify', {\n type: 'boolean',\n default: false,\n describe: 'Verify each payload\\'s $hash against content locally before pushing',\n })\n .option('xl1-sdk', {\n type: 'boolean',\n default: false,\n describe: 'Use the real @xyo-network/xl1-protocol-sdk RestDataLakeRunner',\n }),\n handler: async (argv) => {\n await pushPayloads({\n file: argv.file as string,\n idOrName: argv.name as string | undefined,\n batchSize: argv['batch-size'] as number,\n verify: argv.verify as boolean,\n xl1Sdk: argv['xl1-sdk'] as boolean,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { revokeAccess } from '../actions/datalake/index.ts'\n\nexport const datalakeRevokeCommand: CommandModule = {\n command: 'revoke <name> <principal>',\n describe: 'Revoke a principal\\'s access to a datalake',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id',\n demandOption: true,\n })\n .positional('principal', {\n type: 'string',\n describe: 'User id, or the literal \"public\"',\n demandOption: true,\n }),\n handler: async (argv) => {\n await revokeAccess({\n idOrName: argv.name as string,\n principal: argv.principal as string,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { tailPayloads } from '../actions/datalake/payloads/index.ts'\n\nexport const datalakeTailCommand: CommandModule = {\n command: 'tail [name]',\n describe: 'Stream payloads from a datalake (Ctrl+C to stop with --follow)',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id (defaults to current)',\n })\n .option('follow', {\n alias: 'f',\n type: 'boolean',\n default: false,\n describe: 'Keep polling for new payloads after draining the backlog',\n })\n .option('limit', {\n alias: 'n',\n type: 'number',\n default: 50,\n describe: 'Max payloads per page',\n })\n .option('cursor', {\n type: 'string',\n describe: 'Resume after this hash (exclusive)',\n })\n .option('schemas', {\n type: 'string',\n describe: 'Comma-separated list of schemas to include',\n })\n .option('poll-interval', {\n type: 'number',\n default: 1000,\n describe: 'Poll interval in ms when following',\n }),\n handler: async (argv) => {\n await tailPayloads({\n idOrName: argv.name as string | undefined,\n follow: argv.follow as boolean,\n limit: argv.limit as number,\n cursor: argv.cursor as string | undefined,\n schemas: argv.schemas ? (argv.schemas as string).split(',') : undefined,\n pollIntervalMs: argv['poll-interval'] as number,\n })\n },\n}\n","import type { DatalakeRole } from '@xylabs/aries-datalake-core'\nimport type { CommandModule } from 'yargs'\n\nimport { mintToken } from '../actions/datalake/index.ts'\n\nexport const datalakeTokenCommand: CommandModule = {\n command: 'token [name]',\n describe: 'Mint a scoped JWT for SDK use',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Datalake name or id (defaults to current)',\n })\n .option('role', {\n alias: 'r',\n type: 'string',\n choices: ['viewer', 'runner'] as const,\n default: 'viewer',\n describe: 'Role encoded in the token',\n })\n .option('ttl', {\n type: 'number',\n describe: 'Lifetime in seconds (server-capped)',\n }),\n handler: async (argv) => {\n await mintToken({\n idOrName: argv.name as string | undefined,\n role: argv.role as DatalakeRole,\n ttlSeconds: argv.ttl as number | undefined,\n })\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { useDatalake } from '../actions/datalake/index.ts'\n\nexport const datalakeUseCommand: CommandModule = {\n command: 'use [name]',\n describe: 'Set the default datalake for subsequent commands (omit name to clear)',\n builder: yargs =>\n yargs.positional('name', {\n type: 'string',\n describe: 'Datalake name or id',\n }),\n handler: async (argv) => {\n await useDatalake(argv.name as string | undefined)\n },\n}\n","import type { CommandModule } from 'yargs'\n\nimport { datalakeAuditCommand } from './datalakeAuditCommand.ts'\nimport { datalakeCreateCommand } from './datalakeCreateCommand.ts'\nimport { datalakeDescribeCommand } from './datalakeDescribeCommand.ts'\nimport { datalakeDestroyCommand } from './datalakeDestroyCommand.ts'\nimport { datalakeDevCommand } from './datalakeDevCommand.ts'\nimport { datalakeFetchCommand } from './datalakeFetchCommand.ts'\nimport { datalakeGrantCommand } from './datalakeGrantCommand.ts'\nimport { datalakeListCommand } from './datalakeListCommand.ts'\nimport { datalakeLoginCommand } from './datalakeLoginCommand.ts'\nimport { datalakeLogoutCommand } from './datalakeLogoutCommand.ts'\nimport { datalakePushCommand } from './datalakePushCommand.ts'\nimport { datalakeRevokeCommand } from './datalakeRevokeCommand.ts'\nimport { datalakeTailCommand } from './datalakeTailCommand.ts'\nimport { datalakeTokenCommand } from './datalakeTokenCommand.ts'\nimport { datalakeUseCommand } from './datalakeUseCommand.ts'\n\nexport const datalakeCommand: CommandModule = {\n command: 'datalake',\n describe: 'Provision and manage on-demand XL1 datalakes',\n builder: yargs =>\n yargs\n .command(datalakeLoginCommand)\n .command(datalakeLogoutCommand)\n .command(datalakeCreateCommand)\n .command(datalakeListCommand)\n .command(datalakeDescribeCommand)\n .command(datalakeDestroyCommand)\n .command(datalakeGrantCommand)\n .command(datalakeRevokeCommand)\n .command(datalakeTokenCommand)\n .command(datalakeUseCommand)\n .command(datalakePushCommand)\n .command(datalakeFetchCommand)\n .command(datalakeTailCommand)\n .command(datalakeAuditCommand)\n .command(datalakeDevCommand)\n .demandCommand(1)\n .strictCommands(),\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n handler: () => {},\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EAAkB;AAAA,EAAY;AAAA,EAAa;AAAA,EAAU;AAAA,OAChD;AACP,OAAOA,WAAU;AACjB,SAAS,uBAAuB;AAEhC,SAAS,4BAAiD;AAC1D,OAAO,WAAW;;;ACRlB,SAAS,eAAe;AACxB,OAAO,UAAU;AAEjB,SAAS,eAAuB;AAC9B,SAAO,QAAQ,IAAI,cAAc,KAAK,KAAK,QAAQ,GAAG,QAAQ;AAChE;AAEO,SAAS,YAAoB;AAClC,SAAO,KAAK,KAAK,aAAa,GAAG,KAAK;AACxC;AAEO,SAAS,kBAA0B;AACxC,SAAO,KAAK,KAAK,UAAU,GAAG,YAAY;AAC5C;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,KAAK,UAAU,GAAG,KAAK;AACrC;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,KAAK,UAAU,GAAG,YAAY;AAC5C;;;ADqDA,IAAM,qBAAqB;AAE3B,SAAS,oBAA4B;AACnC,SAAOC,MAAK,KAAK,UAAU,GAAG,WAAW;AAC3C;AAEA,SAAS,qBAA6B;AACpC,SAAOA,MAAK,KAAK,UAAU,GAAG,OAAO;AACvC;AAEA,SAAS,iBAAiB,WAA6B;AACrD,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO,CAAC;AACpC,SAAO,YAAY,SAAS,EACzB,OAAO,UAAQ,mBAAmB,KAAK,IAAI,CAAC,EAC5C,SAAS,EACT,IAAI,UAAQA,MAAK,KAAK,WAAW,IAAI,CAAC;AAC3C;AAEA,SAAS,cAAc,UAA0D;AAC/E,MAAI,UAAU;AACZ,QAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,UAAM,OAAO,SAAS,QAAQ;AAC9B,QAAI,KAAK,YAAY,GAAG;AACtB,YAAMC,SAAQ,iBAAiB,QAAQ;AACvC,UAAIA,OAAM,WAAW,EAAG,QAAO;AAC/B,aAAO;AAAA,QACL,OAAAA;AAAA,QAAO,UAAUA,OAAM,GAAG,EAAE;AAAA,QAAI,aAAa;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO,CAAC,QAAQ;AAAA,MAAG,UAAU;AAAA,MAAU,aAAa;AAAA,IACtD;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB;AACjC,MAAI,WAAW,MAAM,GAAG;AACtB,WAAO;AAAA,MACL,OAAO,CAAC,MAAM;AAAA,MAAG,UAAU;AAAA,MAAQ,aAAa;AAAA,IAClD;AAAA,EACF;AACA,QAAM,SAAS,mBAAmB;AAClC,QAAM,QAAQ,iBAAiB,MAAM;AACrC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO;AAAA,IACL;AAAA,IAAO,UAAU,MAAM,GAAG,EAAE;AAAA,IAAI,aAAa;AAAA,EAC/C;AACF;AAEA,eAAe,kBAAkB,QAAiC;AAChE,MAAI,OAAO,WAAW,KAAK,EAAG,QAAO;AACrC,QAAM,SAAyB,qBAAqB;AACpD,QAAM,aAAa,MAAM,OAAO,SAAS,MAAM;AAC/C,SAAO,WAAW;AACpB;AAEA,eAAe,aAAa,SAAiD;AAC3E,SAAO;AAAA,IACL,YAAY,QAAQ,WAAW,MAAM,kBAAkB,QAAQ,QAAQ,IAAI;AAAA,IAC3E,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ,QAAQ,YAAY;AAAA,IACpC,eAAe,QAAQ,kBAAkB,SAAY,SAAY,QAAQ,kBAAkB;AAAA,IAC3F,WAAW,QAAQ,OAAO,IAAI,OAAO,QAAQ,IAAI,IAAI;AAAA,EACvD;AACF;AAEA,SAAS,eAAe,MAAc,OAAmB,SAAmC;AAC1F,MAAI,QAAQ,cAAc,MAAM,eAAe,QAAQ,WAAY,QAAO;AAC1E,MAAI,QAAQ,gBAAgB,CAAC,OAAO,MAAM,UAAU,EAAE,WAAW,QAAQ,YAAY,EAAG,QAAO;AAC/F,MAAI,QAAQ,UAAU,MAAM,WAAW,QAAQ,OAAQ,QAAO;AAC9D,MAAI,QAAQ,kBAAkB,UAAa,MAAM,kBAAkB,QAAQ,cAAe,QAAO;AACjG,MAAI,QAAQ,aAAa,CAAC,QAAQ,UAAU,KAAK,IAAI,EAAG,QAAO;AAC/D,SAAO;AACT;AAEA,SAAS,YAAY,OAA2B;AAC9C,QAAM,OAAO,MAAM,KAAK,MAAM,IAAI,EAAE;AACpC,QAAM,SAAS,MAAM,cAAc,MAC/B,MAAM,IAAI,OAAO,MAAM,UAAU,CAAC,IAClC,MAAM,cAAc,MAClB,MAAM,OAAO,OAAO,MAAM,UAAU,CAAC,IACrC,MAAM,MAAM,OAAO,MAAM,UAAU,CAAC;AAC1C,QAAM,UAAU,MAAM,gBAAgB,MAAM,QAAQ,MAAM,OAAO,IAAI,MAAM,KAAK,MAAM,OAAO;AAC7F,QAAM,WAAW,MAAM,KAAK,GAAG,MAAM,UAAU,IAAI;AACnD,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,OAAO,OAAO,CAAC,CAAC,IAAI,MAAM,IAAI,IAAI,OAAO,IAAI,QAAQ;AACrG;AAEA,SAAS,UAAU,MAAsC;AACvD,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,SAAS,UAAwB,CAAC,GAAkB;AACxE,QAAM,SAAS,cAAc,QAAQ,IAAI;AACzC,MAAI,CAAC,QAAQ;AACX,UAAM,WAAW,QAAQ,QAAQ,GAAG,kBAAkB,CAAC,OAAO,mBAAmB,CAAC;AAClF,YAAQ,IAAI,MAAM,OAAO,mBAAmB,QAAQ,EAAE,CAAC;AACvD,YAAQ,IAAI,MAAM,KAAK,yEAAyE,CAAC;AACjG,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,aAAa,OAAO;AAE1C,MAAI,QAAQ,QAAQ;AAClB,UAAM,UAAU,OAAO,UAAU,SAAS,QAAQ,SAAS,CAAC;AAC5D;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,OAAO,SAAS,QAAQ,SAAS,EAAE;AAC3D;AAEA,eAAe,SAAS,OAAiB,SAA0B,OAA8B;AAE/F,QAAM,OAAiB,CAAC;AACxB,aAAW,YAAY,OAAO;AAC5B,UAAM,SAAS,iBAAiB,UAAU,EAAE,UAAU,OAAO,CAAC;AAC9D,UAAM,KAAK,gBAAgB,EAAE,OAAO,QAAQ,WAAW,SAAS,CAAC;AACjE,qBAAiB,QAAQ,IAAI;AAC3B,UAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAM,QAAQ,UAAU,IAAI;AAC5B,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,eAAe,MAAM,OAAO,OAAO,EAAG;AAC3C,WAAK,KAAK,YAAY,KAAK,CAAC;AAC5B,UAAI,KAAK,SAAS,MAAO,MAAK,MAAM;AAAA,IACtC;AAAA,EACF;AACA,aAAW,OAAO,KAAM,SAAQ,IAAI,GAAG;AACzC;AAEA,eAAe,UAAU,UAAkB,SAA0B,cAAqC;AACxG,MAAI,eAAe,GAAG;AACpB,UAAM,SAAS,CAAC,QAAQ,GAAG,SAAS,YAAY;AAAA,EAClD;AACA,QAAM,cAAc,SAAS,QAAQ,EAAE;AACvC,QAAM,QAAQ,MAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQ,GAAG,EAAE,OAAO,CAAC,UAAU,QAAQ,SAAS,EAAE,CAAC;AAClG,QAAM,OAAO,YAAY,MAAM;AAC/B,MAAI,SAAS;AACb,MAAI,YAAY;AAChB,QAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,iBAAa,OAAO,WAAW,OAAO,MAAM;AAC5C,cAAU;AACV,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,aAAS,MAAM,IAAI,KAAK;AACxB,QAAI,YAAY,YAAa;AAC7B,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAM,QAAQ,UAAU,IAAI;AAC5B,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,eAAe,MAAM,OAAO,OAAO,EAAG;AAC3C,cAAQ,IAAI,YAAY,KAAK,CAAC;AAAA,IAChC;AAAA,EACF,CAAC;AACD,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,cAAQ,WAAW,QAAQ;AAC3B,cAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAMO,SAAS,cAAc,SAAsC;AAClE,QAAM,YAAY,QAAQ,aAAa,mBAAmB;AAC1D,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO,CAAC;AACpC,QAAM,SAAS,KAAK,IAAI,IAAI,QAAQ,aAAa;AACjD,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,YAAY,SAAS,GAAG;AACzC,QAAI,CAAC,mBAAmB,KAAK,IAAI,EAAG;AACpC,UAAM,WAAWD,MAAK,KAAK,WAAW,IAAI;AAC1C,UAAM,OAAO,SAAS,QAAQ;AAC9B,QAAI,KAAK,WAAW,OAAQ;AAC5B,QAAI,CAAC,QAAQ,OAAQ,YAAW,QAAQ;AACxC,YAAQ,KAAK,QAAQ;AAAA,EACvB;AACA,SAAO;AACT;;;AE1PA,IAAM,cAA6B;AAAA,EACjC,SAAS,CAAC,QAAQ,IAAI;AAAA,EACtB,UAAU;AAAA,EACV,SAAS,WACP,MACG,OAAO,UAAU;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,YAAY;AAAA,IAClB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,iBAAiB;AAAA,IACvB,MAAM;AAAA,IACN,SAAS,CAAC,QAAQ,OAAO;AAAA,IACzB,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,SAAS;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK;AAAA,MACpB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEA,IAAM,eAA8B;AAAA,EAClC,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,OAAO,gBAAgB;AAAA,IACtB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,aAAa;AAAA,IACnB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,CAAC,SAAS;AACjB,UAAM,UAAU,cAAc;AAAA,MAC5B,YAAY,KAAK,cAAc;AAAA,MAC/B,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK,SAAS;AAAA,IACxB,CAAC;AACD,UAAM,OAAO,KAAK,SAAS,IAAI,iBAAiB;AAChD,YAAQ,IAAI,GAAG,IAAI,IAAI,QAAQ,MAAM,WAAW;AAChD,eAAW,QAAQ,QAAS,SAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACrD;AACF;AAEO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,QAAQ,WAAW,EACnB,QAAQ,YAAY;AAAA;AAAA,EAEzB,SAAS,MAAM;AAAA,EAAC;AAClB;;;ACpGA,SAAS,kBAAkB,sBAAsB;;;ACDjD,SAAS,wBAAAE,6BAA4B;AAIrC,OAAOC,YAAW;;;ACDlB,OAAOC,YAAW;AAElB,IAAM,gBAA+D;AAAA,EACnE,SAASA,OAAM;AAAA,EACf,cAAcA,OAAM;AAAA,EACpB,OAAOA,OAAM;AAAA,EACb,UAAUA,OAAM;AAAA,EAChB,gBAAgBA,OAAM;AAAA,EACtB,SAASA,OAAM;AAAA,EACf,OAAOA,OAAM;AACf;AAEO,SAAS,YAAY,OAAuB;AACjD,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,QAAQ,EAAG,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC1D,MAAI,QAAQ,QAAQ,EAAG,QAAO,IAAI,QAAQ,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAC/D,MAAI,QAAQ,QAAQ,EAAG,QAAO,IAAI,QAAQ,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAC/D,SAAO,IAAI,QAAQ,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAC1C;AAEO,SAAS,aAAa,QAAgC;AAC3D,QAAM,WAAW,cAAc,MAAM,KAAKA,OAAM;AAChD,SAAO,SAAS,MAAM;AACxB;AAEO,SAAS,iBAAiB,UAAoC;AACnE,QAAM,OAAO,SAAS,OAAO,YAAY,YAAY,SAAS,OAAO,SAAS,IAAI;AAClF,QAAM,OAAOA,OAAM,MAAM,SAAS,KAAK,OAAO,EAAE,CAAC;AACjD,QAAM,OAAOA,OAAM,KAAK,SAAS,OAAO,KAAK,OAAO,CAAC,CAAC;AACtD,QAAM,SAASA,OAAM,MAAM,SAAS,OAAO,UAAU,UAAK,OAAO,EAAE,CAAC;AACpE,QAAM,SAAS,aAAa,SAAS,MAAM,EAAE,OAAO,EAAE;AACtD,UAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC,KAAK,MAAM,EAAE;AAC1E;AAEA,SAAS,gBAAgB,QAAkC;AACzD,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO,2BAA2B,OAAW,OAAM,KAAK,QAAQ,OAAO,sBAAsB,MAAM;AACvG,MAAI,OAAO,uBAAuB,OAAW,OAAM,KAAK,QAAQ,OAAO,kBAAkB,MAAM;AAC/F,MAAI,OAAO,gBAAgB,OAAW,OAAM,KAAK,SAAS,OAAO,WAAW,GAAG;AAC/E,MAAI,MAAM,SAAS,GAAG;AACpB,YAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,QAAQ,MAAM,KAAK,GAAG,CAAC,EAAE;AAAA,EACjE;AACF;AAEA,SAAS,WAAW,OAA4B;AAC9C,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,SAAS,CAAC;AACjC,UAAQ,IAAI,OAAOA,OAAM,KAAK,WAAW,CAAC,MAAM,MAAM,YAAY,EAAE;AACpE,UAAQ,IAAI,OAAOA,OAAM,KAAK,SAAS,CAAC,QAAQ,YAAY,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,gBAAgB,CAAC,EAAE;AACzH,UAAQ,IAAI,OAAOA,OAAM,KAAK,YAAY,CAAC,KAAK,MAAM,YAAY,EAAE;AACpE,UAAQ,IAAI,OAAOA,OAAM,KAAK,aAAa,CAAC,IAAI,MAAM,aAAa,EAAE;AACvE;AAEA,SAAS,SAAS,KAAsC;AACtD,MAAI,IAAI,WAAW,EAAG;AACtB,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,UAAU,CAAC;AAClC,aAAW,SAAS,KAAK;AACvB,UAAM,YAAY,MAAM,cAAc,WAAWA,OAAM,OAAO,QAAQ,IAAI,MAAM;AAChF,YAAQ,IAAI,OAAO,UAAU,OAAO,EAAE,CAAC,IAAIA,OAAM,QAAQ,MAAM,IAAI,CAAC,KAAKA,OAAM,KAAK,MAAM,SAAS,CAAC,EAAE;AAAA,EACxG;AACF;AAEO,SAAS,oBAAoB,UAAoC;AACtE,UAAQ,IAAIA,OAAM,KAAK;AAAA,EAAK,SAAS,IAAI,EAAE,CAAC;AAC5C,UAAQ,IAAI,KAAKA,OAAM,KAAK,KAAK,CAAC,YAAY,SAAS,EAAE,EAAE;AAC3D,UAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,QAAQ,aAAa,SAAS,MAAM,CAAC,EAAE;AAC7E,MAAI,SAAS,KAAK;AAChB,YAAQ,IAAI,KAAKA,OAAM,KAAK,MAAM,CAAC,WAAW,SAAS,GAAG,EAAE;AAAA,EAC9D;AACA,UAAQ,IAAI,KAAKA,OAAM,KAAK,QAAQ,CAAC,SAAS,SAAS,OAAO,EAAE;AAChE,UAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,UAAU,SAAS,OAAO,IAAI,EAAE;AACpE,UAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,QAAQ,SAAS,OAAO,UAAU,QAAG,EAAE;AAC7E,UAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,UAAU,SAAS,OAAO,YAAY,YAAY,SAAS,OAAO,SAAS,IAAI,QAAG,EAAE;AACxH,UAAQ,IAAI,KAAKA,OAAM,KAAK,OAAO,CAAC,UAAU,SAAS,OAAO,QAAQ,QAAG,EAAE;AAC3E,UAAQ,IAAI,KAAKA,OAAM,KAAK,YAAY,CAAC,KAAK,SAAS,OAAO,iBAAiB,SAAS,EAAE;AAC1F,MAAI,SAAS,OAAO,cAAc;AAChC,YAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,QAAQA,OAAM,MAAM,iBAAiB,CAAC,EAAE;AAAA,EAChF;AACA,MAAI,SAAS,OAAO,WAAY,iBAAgB,SAAS,OAAO,UAAU;AAC1E,UAAQ,IAAI,KAAKA,OAAM,KAAK,UAAU,CAAC,OAAO,SAAS,SAAS,EAAE;AAClE,UAAQ,IAAI,KAAKA,OAAM,KAAK,UAAU,CAAC,OAAO,SAAS,SAAS,EAAE;AAClE,MAAI,SAAS,MAAO,YAAW,SAAS,KAAK;AAC7C,WAAS,SAAS,GAAG;AACrB,MAAI,SAAS,cAAc;AACzB,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,OAAM,IAAI,QAAQ,CAAC,IAAI,SAAS,YAAY,EAAE;AAAA,EACjE;AACF;;;AC3FA,IAAM,aAAqC;AAAA,EACzC,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ;AAAA,EACZ,IAAI,QAAQ;AACd;AAMO,SAAS,UAAU,OAAuB;AAC/C,QAAM,QAAQ,mCAAmC,KAAK,MAAM,KAAK,CAAC;AAClE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,iBAAiB,KAAK,EAAE;AACpD,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAM,WAAW,MAAM,CAAC,KAAK,KAAK,YAAY;AAC9C,QAAM,OAAO,WAAW,OAAO;AAC/B,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,sBAAsB,MAAM,CAAC,CAAC,EAAE;AACxE,SAAO,KAAK,MAAM,QAAQ,IAAI;AAChC;;;AFEA,SAAS,gBAAgB,SAAgE;AACvF,MACE,QAAQ,sBAAsB,UAC3B,QAAQ,sBAAsB,UAC9B,QAAQ,oBAAoB,OAC/B,QAAO;AACT,SAAO;AAAA,IACL,wBAAwB,QAAQ;AAAA,IAChC,oBAAoB,QAAQ;AAAA,IAC5B,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,eAAsB,eAAe,SAA+C;AAClF,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAyB;AAAA,IAC7B,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ,SAAS,SAAY,SAAY,UAAU,QAAQ,IAAI;AAAA,IAC1E,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ;AAAA,IACvB,cAAc,QAAQ;AAAA,IACtB,YAAY,gBAAgB,OAAO;AAAA,EACrC;AAEA,UAAQ,IAAIC,OAAM,KAAK,gBAAgB,QAAQ,IAAI,UAAU,QAAQ,IAAI,MAAM,CAAC;AAChF,QAAM,aAAa,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AACrE,UAAQ,IAAIA,OAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,EAAE,GAAG,CAAC;AACxE,sBAAoB,UAAU;AAChC;;;AGlDA,SAAS,wBAAAC,6BAA4B;AACrC,OAAOC,YAAW;;;ACDlB,SAAS,wBAAAC,uBAAsB,0BAA0B;AAEzD,SAAS,yBAAyB;;;ACHlC,SAAS,0BAA0B;AAM5B,SAAS,cAAc,UAAsC;AAClE,QAAM,SAAS,YAAY,mBAAmB;AAC9C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;;;ADkBA,eAAsB,eAAe,SAAqD;AACxF,QAAM,gBAAgBC,sBAAqB;AAC3C,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAC7C,QAAM,aAAa,MAAM,cAAc,SAAS,MAAM;AACtD,MAAI,CAAC,WAAW,KAAK;AACnB,UAAM,IAAI,MAAM,YAAY,WAAW,IAAI,2BAA2B,WAAW,MAAM,GAAG;AAAA,EAC5F;AACA,QAAM,QAAQ,MAAM,cAAc,UAAU;AAAA,IAC1C,YAAY,WAAW;AAAA,IACvB,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ,cAAc;AAAA,EACpC,CAAC;AACD,QAAM,gBAAgB;AAAA,IACpB,SAAS,MAAM;AAAA,IACf,YAAY,WAAW;AAAA,IACvB,WAAW,MAAM;AAAA,EACnB;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ,YACZ,IAAI,kBAAkB,aAAa,IACnC,IAAI,mBAAmB,aAAa;AAAA,IACxC,cAAc,WAAW;AAAA,IACzB,YAAY,WAAW;AAAA,IACvB,KAAK,MAAM;AAAA,IACX,WAAW,QAAQ,YAAY,YAAY;AAAA,EAC7C;AACF;;;ADnDA,eAAsB,iBAAiB,UAA6C;AAClF,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAS,cAAc,QAAQ;AACrC,QAAM,aAAa,MAAM,OAAO,SAAS,MAAM;AAC/C,sBAAoB,UAAU;AAE9B,MAAI,WAAW,WAAW,QAAS;AAKnC,MAAI;AACF,UAAM,aAAa,MAAM,eAAe,EAAE,UAAU,QAAQ,MAAM,SAAS,CAAC;AAC5E,UAAM,QAAQ,MAAM,WAAW,OAAO,MAAM;AAC5C,mBAAe,KAAK;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ,IAAI;AACZ,YAAQ,IAAIC,OAAM;AAAA,MAChB,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACtF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,OAAkC;AACxD,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,QAAQ,CAAC;AAChC,UAAQ,IAAI,OAAOA,OAAM,KAAK,WAAW,CAAC,UAAU,MAAM,YAAY,EAAE;AACxE,QAAM,SAAS,MAAM;AACrB,MAAI,QAAQ,eAAe;AACzB,UAAM,EAAE,WAAW,MAAM,IAAI,OAAO;AACpC,YAAQ,IAAI,OAAOA,OAAM,KAAK,aAAa,CAAC,QAAQ,SAAS,IAAI,KAAK,EAAE;AAAA,EAC1E;AACA,MAAI,QAAQ,WAAW;AACrB,UAAM,EAAE,WAAW,MAAM,IAAI,OAAO;AACpC,YAAQ,IAAI,OAAOA,OAAM,KAAK,aAAa,CAAC,QAAQ,SAAS,IAAI,KAAK,EAAE;AAAA,EAC1E;AACF;;;AG5CA,SAAS,wBAAAC,6BAA4B;AACrC,OAAOC,YAAW;AASlB,eAAsB,gBAAgB,SAAgD;AACpF,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAE7C,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ,IAAIC,OAAM;AAAA,MAChB,uBAAuB,MAAM;AAAA,IAE/B,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,MAAM;AAC3B,UAAQ,IAAIA,OAAM,MAAM,aAAa,MAAM,EAAE,CAAC;AAChD;;;ACzBA,SAAS,wBAAAC,6BAA4B;AAErC,OAAOC,YAAW;AAYlB,eAAsB,YAAY,SAA4C;AAC5E,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAE7C,MAAI,QAAQ,cAAc,YAAY,QAAQ,SAAS,YAAY,CAAC,QAAQ,eAAe;AACzF,YAAQ,IAAIC,OAAM;AAAA,MAChB;AAAA,IAEF,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,OAAO,SAAS,MAAM;AAC/C,QAAM,UAAU,MAAM,OAAO,MAAM;AAAA,IACjC,YAAY,WAAW;AAAA,IACvB,WAAW,QAAQ;AAAA,IACnB,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,UAAQ,IAAIA,OAAM,MAAM,WAAW,QAAQ,IAAI,OAAO,QAAQ,SAAS,OAAO,QAAQ,IAAI,EAAE,CAAC;AAC7F,sBAAoB,OAAO;AAC7B;;;ACnCA,SAAS,wBAAAC,6BAA4B;AACrC,OAAOC,YAAW;AAIlB,eAAsB,gBAA+B;AACnD,QAAM,SAASC,sBAAqB;AACpC,QAAM,YAAY,MAAM,OAAO,KAAK;AAEpC,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAIC,OAAM,OAAO,mEAAmE,CAAC;AAC7F;AAAA,EACF;AAEA,UAAQ;AAAA,IACNA,OAAM,KAAK,IAAI,IACbA,OAAM,KAAK,OAAO,OAAO,EAAE,CAAC,IAC5B,MACAA,OAAM,KAAK,OAAO,OAAO,CAAC,CAAC,IAC3B,MACAA,OAAM,KAAK,SAAS,OAAO,EAAE,CAAC,IAC9B,MACAA,OAAM,KAAK,UAAU,IACrB,OACAA,OAAM,KAAK,QAAQ;AAAA,EACvB;AACA,aAAW,YAAY,WAAW;AAChC,qBAAiB,QAAQ;AAAA,EAC3B;AACF;;;AC7BA,SAAS,uBAAuB;AAChC,OAAOC,YAAW;AAWlB,eAAsB,MAAM,SAAsC;AAChE,QAAM,UAAU,QAAQ,WAAW,QAAQ,IAAI;AAC/C,QAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAE3C,MAAI,CAAC,WAAW,CAAC,OAAO;AACtB,YAAQ,IAAIA,OAAM;AAAA,MAChB;AAAA,IAEF,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,kBAAgB,EAAE,SAAS,WAAW,MAAM,CAAC;AAC7C,UAAQ,IAAIA,OAAM,MAAM,yBAAyB,OAAO,EAAE,CAAC;AAC7D;;;AC3BA,SAAS,wBAAwB;AACjC,OAAOC,YAAW;AAElB,eAAsB,SAAwB;AAC5C,mBAAiB;AACjB,UAAQ,IAAIA,OAAM,MAAM,YAAY,CAAC;AACvC;;;ACNA,SAAS,wBAAAC,6BAA4B;AAErC,OAAOC,aAAW;AAUlB,eAAsB,UAAU,SAA0C;AACxE,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAC7C,QAAM,aAAa,MAAM,OAAO,SAAS,MAAM;AAC/C,QAAM,QAAQ,MAAM,OAAO,UAAU;AAAA,IACnC,YAAY,WAAW;AAAA,IACvB,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ;AAAA,EACtB,CAAC;AAED,UAAQ,IAAIC,QAAM,KAAK,gBAAgB,CAAC;AACxC,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE;AACrD,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE;AACtD,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,OAAO,MAAM,SAAS,EAAE;AAC3D,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,KAAK;AACzB;;;AC5BA,SAAS,wBAAAC,6BAA4B;AAErC,OAAOC,aAAW;AAUlB,eAAsB,aAAa,SAA6C;AAC9E,QAAM,SAASC,sBAAqB;AACpC,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAC7C,QAAM,aAAa,MAAM,OAAO,SAAS,MAAM;AAC/C,QAAM,UAAU,MAAM,OAAO,OAAO;AAAA,IAClC,YAAY,WAAW;AAAA,IACvB,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,UAAQ,IAAIC,QAAM,MAAM,sBAAsB,QAAQ,SAAS,OAAO,QAAQ,IAAI,EAAE,CAAC;AACrF,sBAAoB,OAAO;AAC7B;;;ACtBA;AAAA,EACE;AAAA,EAAsB,wBAAAC;AAAA,EAAsB;AAAA,OACvC;AACP,OAAOC,aAAW;AAElB,eAAsB,YAAY,MAAyC;AACzE,MAAI,CAAC,MAAM;AACT,yBAAqB;AACrB,YAAQ,IAAIA,QAAM,MAAM,0BAA0B,CAAC;AACnD;AAAA,EACF;AAEA,QAAM,SAASD,uBAAqB;AACpC,QAAM,aAAa,MAAM,OAAO,SAAS,IAAI;AAC7C,qBAAmB,WAAW,MAAM,WAAW,EAAE;AACjD,UAAQ,IAAIC,QAAM,MAAM,2BAA2B,WAAW,IAAI,KAAK,WAAW,EAAE,GAAG,CAAC;AAC1F;;;AdVO,IAAM,wBAAuC;AAAA,EAClD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,kBAAkB;AAAA,IACxB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,iBAAiB;AAAA,IACvB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,wBAAwB;AAAA,IAC9B,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,wBAAwB;AAAA,IAC9B,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,qBAAqB;AAAA,IAC3B,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,eAAe;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,eAAe,KAAK,gBAAgB;AAAA,MACpC,cAAc,KAAK,eAAe;AAAA,MAClC,mBAAmB,KAAK,sBAAsB;AAAA,MAC9C,mBAAmB,KAAK,sBAAsB;AAAA,MAC9C,iBAAiB,KAAK,mBAAmB;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;;;AerEO,IAAM,0BAAyC;AAAA,EACpD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MAAM,WAAW,QAAQ;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACH,SAAS,OAAO,SAAS;AACvB,UAAM,iBAAiB,KAAK,IAA0B;AAAA,EACxD;AACF;;;ACXO,IAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,gBAAgB;AAAA,MACpB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;ACzBA,SAAS,oBAAAC,mBAAkB,uBAAuB;AAClD,OAAOC,aAAW;;;ACDlB;AAAA,EACE,cAAAC;AAAA,EAAY;AAAA,EAAW;AAAA,EAAc,cAAAC;AAAA,EAAY;AAAA,OAC5C;AA2BA,SAAS,eAAqC;AACnD,QAAM,WAAW,gBAAgB;AACjC,MAAI,CAACC,YAAW,QAAQ,EAAG,QAAO;AAClC,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,UAAU,MAAM,CAAC;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,OAAuB;AACnD,QAAM,MAAM,UAAU;AACtB,MAAI,CAACA,YAAW,GAAG,EAAG,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACxD,gBAAc,gBAAgB,GAAG,KAAK,UAAU,OAAO,QAAW,CAAC,GAAG,MAAM;AAC5E,gBAAc,cAAc,GAAG,OAAO,MAAM,GAAG,GAAG,MAAM;AAC1D;AAEO,SAAS,gBAAsB;AACpC,aAAW,YAAY,CAAC,gBAAgB,GAAG,cAAc,CAAC,GAAG;AAC3D,QAAIA,YAAW,QAAQ,EAAG,CAAAC,YAAW,QAAQ;AAAA,EAC/C;AACF;AAOO,SAAS,eAAe,KAAsB;AACnD,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,WAAO,SAAS;AAAA,EAClB;AACF;;;ADhDA,IAAM,mBAAmB;AACzB,IAAM,UAAU;AAEhB,eAAsB,cAAc,UAAgC,CAAC,GAAkB;AACrF,QAAM,QAAQ,aAAa;AAC3B,MAAI,CAAC,OAAO;AACV,YAAQ,IAAIC,QAAM,OAAO,2BAA2B,CAAC;AACrD;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,iBAAiB;AAEzC,MAAI,CAAC,eAAe,MAAM,GAAG,GAAG;AAC9B,YAAQ,MAAM,UAAU;AACxB,YAAQ,IAAIA,QAAM,MAAM,kBAAkB,MAAM,GAAG,8CAAyC,CAAC;AAC7F;AAAA,EACF;AAEA,MAAI;AACF,YAAQ,KAAK,MAAM,KAAK,SAAS;AAAA,EACnC,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,QAAS,OAAM;AAAA,EAC9B;AAEA,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,YAAY,eAAe,MAAM,GAAG,GAAG;AACzD,UAAM,MAAM,OAAO;AAAA,EACrB;AACA,MAAI,eAAe,MAAM,GAAG,GAAG;AAC7B,QAAI;AACF,cAAQ,KAAK,MAAM,KAAK,SAAS;AAAA,IACnC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,MAAM,UAAU;AACxB,UAAQ,IAAIA,QAAM,MAAM,kBAAkB,MAAM,GAAG,UAAU,CAAC;AAChE;AAEA,SAAS,QAAQ,YAA0B;AACzC,QAAM,cAAc,gBAAgB;AACpC,MAAI,aAAa,YAAY,YAAY;AACvC,IAAAC,kBAAiB;AAAA,EACnB;AACA,gBAAc;AAChB;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;;;AEnEA,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AAEzC,OAAOC,aAAW;AAelB,eAAsB,cAAc,UAAgC,CAAC,GAAkB;AACrF,QAAM,UAAU,cAAc;AAC9B,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,YAAQ,IAAIC,QAAM,OAAO,4BAA4B,CAAC;AACtD;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,QAAQC,OAAM,QAAQ,CAAC,MAAM,OAAO,QAAQ,SAAS,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AACpG,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,gBAAQ,WAAW,QAAQ;AAC3B,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AACD;AAAA,EACF;AAEA,QAAM,QAAQC,cAAa,SAAS,MAAM,EAAE,MAAM,IAAI;AACtD,QAAM,OAAO,MAAM,MAAM,EAAE,QAAQ,SAAS,GAAG;AAC/C,UAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC;AACpC,MAAI,CAAC,KAAK,GAAG,EAAE,GAAG,SAAS,IAAI,EAAG,SAAQ,OAAO,MAAM,IAAI;AAC7D;;;ACxCA,SAAS,cAAAC,aAAY,cAAc;AAEnC,OAAOC,aAAW;AASlB,eAAsB,iBAAgC;AACpD,QAAM,cAAc;AACpB,QAAM,MAAM,UAAU;AACtB,MAAI,CAACC,YAAW,GAAG,GAAG;AACpB,YAAQ,IAAIC,QAAM,MAAM,kBAAkB,CAAC;AAC3C;AAAA,EACF;AACA,SAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC5C,UAAQ,IAAIA,QAAM,MAAM,SAAS,GAAG,EAAE,CAAC;AACzC;;;ACpBA,OAAOC,aAAW;AAKlB,eAAsB,kBAAiC;AACrD,QAAM,QAAQ,aAAa;AAC3B,MAAI,CAAC,OAAO;AACV,YAAQ,IAAIC,QAAM,OAAO,wBAAwB,CAAC;AAClD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe,MAAM,GAAG;AACtC,QAAM,UAAU,QAAQ,MAAM,WAAW,MAAM,UAAU,IAAI;AAC7D,QAAM,SAAS,aAAa,MAAM,SAAS;AAE3C,UAAQ,IAAIA,QAAM,KAAK,mBAAmB,CAAC;AAC3C,UAAQ,IAAI,KAAKA,QAAM,KAAK,QAAQ,CAAC,OAAO,YAAY,OAAO,OAAO,CAAC,EAAE;AACzE,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,SAAS,MAAM,GAAG,EAAE;AACvD,UAAQ,IAAI,KAAKA,QAAM,KAAK,UAAU,CAAC,KAAK,MAAM,UAAU,EAAE;AAC9D,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,QAAQ,MAAM,QAAQ,EAAE;AAC5D,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,QAAQ,MAAM,MAAM,EAAE;AAC1D,UAAQ,IAAI,KAAKA,QAAM,KAAK,UAAU,CAAC,KAAK,MAAM,SAAS,GAAG,SAAS,KAAK,MAAM,MAAM,EAAE,EAAE;AAC5F,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,SAAS,cAAc,CAAC,EAAE;AAE7D,MAAI,SAAS,CAAC,SAAS;AACrB,YAAQ,WAAW;AAAA,EACrB,WAAW,CAAC,OAAO;AACjB,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,OAAgB,SAA0B;AAC7D,MAAI,SAAS,QAAS,QAAOA,QAAM,MAAM,mBAAmB;AAC5D,MAAI,MAAO,QAAOA,QAAM,OAAO,0BAA0B;AACzD,SAAOA,QAAM,IAAI,4BAA4B;AAC/C;AAEA,eAAe,WAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,UAAU,cAAc,EAAE,QAAQ,WAAW,OAAO,CAAC;AACrF,iBAAa,OAAO;AACpB,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,WAA2B;AAC/C,QAAM,UAAU,IAAI,KAAK,SAAS,EAAE,QAAQ;AAC5C,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI,IAAI,WAAW,GAAI,CAAC;AACrE,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,KAAK,UAAU,EAAE;AACpD,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,SAAO,GAAG,KAAK,KAAK,UAAU,EAAE;AAClC;;;AC3DA,SAAS,SAAAC,cAAa;AACtB,SAAS,mBAAmB;AAC5B;AAAA,EACE,cAAAC;AAAA,EAAY,aAAAC;AAAA,EAAW;AAAA,OAClB;AACP,OAAOC,WAAU;AAEjB,SAAS,mBAAAC,wBAAuB;AAChC,OAAOC,aAAW;;;ACTlB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,OAAOC,WAAU;AAMjB,IAAMC,WAAU,cAAc,YAAY,GAAG;AAQtC,SAAS,mBAA2B;AACzC,MAAI;AACJ,MAAI;AACF,sBAAkBA,SAAQ,QAAQ,2CAA2C;AAAA,EAC/E,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,QAAM,UAAUD,MAAK,KAAKA,MAAK,QAAQ,eAAe,GAAG,QAAQ,OAAO,eAAe;AACvF,MAAI,CAACD,YAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,kCAAkC,OAAO;AAAA,IAE3C;AAAA,EACF;AACA,SAAO;AACT;;;AClCA,IAAM,mBAAmB;AAOzB,eAAsB,cAAc,SAAiB,WAAqC;AACxF,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,QAAM,MAAM,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC;AACzC,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAI,SAAS,GAAI,QAAO;AAAA,IAC1B,QAAQ;AAAA,IAER;AACA,UAAMG,OAAM,gBAAgB;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAASA,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;;;AFwBA,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,0BAA0B;AAiBhC,SAAS,eAAe,SAA8C;AACpE,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,SAAS,QAAQ,gBAAgB;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,oBAAoB,WAAW;AAAA,IAC3C,UAAU,oBAAoB,SAAS;AAAA,IACvC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,WAAW,QAAQ,aAAa,YAAY,EAAE,EAAE,SAAS,KAAK;AAAA,IAC9D,eAAe,QAAQ,iBAAiB,YAAY,EAAE,EAAE,SAAS,KAAK;AAAA,IACtE,YAAY,QAAQ,kBAAkB,2BAA2B;AAAA,IACjE,YAAY,QAAQ,UAAUC,MAAK,KAAK,UAAU,GAAG,OAAO,IAAI;AAAA,IAChE,cAAc,QAAQ,SAAS,CAAC,SAASA,MAAK,KAAK,UAAU,GAAG,WAAW,IAAI;AAAA,IAC/E,UAAU,QAAQ,SAAS,SAASA,MAAK,KAAK,UAAU,GAAG,OAAO,IAAI;AAAA,IACtE,eAAe,SAAS,QAAQ,gBAAgB;AAAA,EAClD;AACF;AAEA,SAAS,YAAY,SAAiB,UAAyC;AAC7E,QAAM,SAAS,UAAU;AACzB,MAAI,CAACC,YAAW,MAAM,EAAG,CAAAC,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,QAAM,QAAQ,SAAS,cAAc,GAAG,GAAG;AAE3C,QAAM,MAAyB;AAAA,IAC7B,GAAG,QAAQ;AAAA,IACX,cAAc,OAAO,SAAS,WAAW;AAAA,IACzC,YAAY,OAAO,SAAS,SAAS;AAAA,IACrC,MAAM;AAAA,IACN,yBAAyB,GAAG,SAAS,SAAS,IAAI,SAAS,MAAM;AAAA,IACjE,sBAAsB,SAAS;AAAA,IAC/B,qBAAqB,SAAS;AAAA,IAC9B,WAAW,QAAQ,IAAI,aAAa;AAAA,EACtC;AACA,MAAI,SAAS,WAAY,KAAI,uBAAuB,SAAS;AAC7D,MAAI,SAAS,aAAc,KAAI,qBAAqB,SAAS;AAC7D,MAAI,SAAS,SAAU,KAAI,qBAAqB,SAAS;AACzD,MAAI,SAAS,kBAAkB,OAAW,KAAI,8BAA8B,OAAO,SAAS,aAAa;AAEzG,QAAM,QAAQC,OAAM,QAAQ,UAAU,CAAC,OAAO,GAAG;AAAA,IAC/C,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,QAAM,MAAM;AACZ,SAAO;AACT;AAEA,SAAS,cAAc,UAAmC;AACxD,MAAI,SAAS,UAAU;AACrB,WAAO,YAAY,SAAS,QAAQ,GAAG,SAAS,gBAAgB,UAAU,SAAS,aAAa,OAAO,EAAE;AAAA,EAC3G;AACA,SAAO,SAAS,gBAAgB;AAClC;AAEA,SAAS,iBAAiB,OAAiB,UAAiC;AAC1E,UAAQ,IAAIC,QAAM,MAAM,kBAAkB,CAAC;AAC3C,UAAQ,IAAI,KAAKA,QAAM,KAAK,UAAU,CAAC,KAAK,MAAM,UAAU,EAAE;AAC9D,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,QAAQ,MAAM,QAAQ,EAAE;AAC5D,UAAQ,IAAI,KAAKA,QAAM,KAAK,OAAO,CAAC,QAAQ,MAAM,MAAM,EAAE;AAC1D,UAAQ,IAAI,KAAKA,QAAM,KAAK,MAAM,CAAC,SAAS,cAAc,CAAC,EAAE;AAC7D,UAAQ,IAAI,KAAKA,QAAM,KAAK,QAAQ,CAAC,OAAO,SAAS,aAAa,cAAc,SAAS,UAAU,MAAM,WAAW,EAAE;AACtH,UAAQ,IAAI,KAAKA,QAAM,KAAK,QAAQ,CAAC,OAAO,cAAc,QAAQ,CAAC,EAAE;AACrE,UAAQ,IAAIA,QAAM,KAAK,sDAAiD,CAAC;AAC3E;AAEA,eAAsB,YAAY,UAA8B,CAAC,GAAsB;AACrF,QAAM,WAAW,aAAa;AAC9B,MAAI,YAAY,eAAe,SAAS,GAAG,GAAG;AAC5C,YAAQ,IAAIA,QAAM,OAAO,mCAAmC,SAAS,GAAG,QAAQ,SAAS,UAAU,EAAE,CAAC;AACtG,WAAO;AAAA,EACT;AACA,MAAI,SAAU,eAAc;AAE5B,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,QAAQ,YAAY,iBAAiB,GAAG,QAAQ;AACtD,MAAI,CAAC,MAAM,IAAK,OAAM,IAAI,MAAM,oCAAoC;AAEpE,UAAQ,IAAIA,QAAM,KAAK,4BAA4B,MAAM,GAAG,MAAM,CAAC;AACnE,QAAM,UAAU,MAAM,cAAc,SAAS,YAAY,SAAS,SAAS;AAC3E,MAAI,CAAC,SAAS;AACZ,QAAI;AACF,cAAQ,KAAK,MAAM,KAAK,SAAS;AAAA,IACnC,QAAQ;AAAA,IAER;AACA,UAAM,IAAI;AAAA,MACR,4CAA4C,SAAS,YAAY,GAAI,oBAClD,cAAc,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,QAAkB;AAAA,IACtB,KAAK,MAAM;AAAA,IACX,YAAY,SAAS;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS;AAAA,IACjB,WAAW,SAAS;AAAA,IACpB,eAAe,SAAS;AAAA,IACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,gBAAc,KAAK;AACnB,EAAAC,iBAAgB;AAAA,IACd,SAAS,SAAS;AAAA,IAAY,WAAW,SAAS;AAAA,IAAW,QAAQ,SAAS;AAAA,EAChF,CAAC;AACD,mBAAiB,OAAO,QAAQ;AAChC,SAAO;AACT;;;AG7KO,IAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,YAAY;AACnB,UAAM,cAAc;AAAA,EACtB;AACF;;;ACNO,IAAM,yBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,OAAO,UAAU;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,cAAc;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;ACvBO,IAAM,0BAAyC;AAAA,EACpD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,YAAY;AACnB,UAAM,eAAe;AAAA,EACvB;AACF;;;ACNO,IAAM,2BAA0C;AAAA,EACrD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,YAAY;AACnB,UAAM,gBAAgB;AAAA,EACxB;AACF;;;ACNO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,OAAO,gBAAgB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,cAAc;AAAA,IACpB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,gBAAgB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,mBAAmB;AAAA,IACzB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,YAAY;AAAA,MAChB,aAAa,KAAK,cAAc;AAAA,MAChC,WAAW,KAAK,YAAY;AAAA,MAC5B,gBAAgB,KAAK;AAAA,MACrB,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK,cAAc;AAAA,MAChC,eAAe,KAAK,iBAAiB;AAAA,IACvC,CAAC;AAAA,EACH;AACF;;;AC9CO,IAAM,qBAAoC;AAAA,EAC/C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,QAAQ,oBAAoB,EAC5B,QAAQ,sBAAsB,EAC9B,QAAQ,wBAAwB,EAChC,QAAQ,sBAAsB,EAC9B,QAAQ,uBAAuB,EAC/B,cAAc,CAAC,EACf,eAAe;AAAA;AAAA,EAEpB,SAAS,MAAM;AAAA,EAAC;AAClB;;;ACtBA,SAAS,wBAAwB;AACjC,OAAOC,aAAW;AAalB,eAAsB,aAAa,SAA6C;AAC9E,QAAM,aAAa,MAAM,eAAe;AAAA,IACtC,UAAU,QAAQ;AAAA,IAAU,MAAM;AAAA,IAAU,WAAW,QAAQ;AAAA,EACjE,CAAC;AACD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW,OAAO,IAAI,QAAQ,IAAI;AACxD,QAAI,QAAQ,KAAK;AACf,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AACnD;AAAA,IACF;AACA,YAAQ,IAAIC,QAAM,KAAK,GAAG,WAAW,YAAY,MAAM,QAAQ,IAAI,EAAE,CAAC;AACtE,YAAQ,IAAI,KAAK,UAAU,SAAS,QAAW,CAAC,CAAC;AAAA,EACnD,SAAS,OAAO;AACd,QAAI,iBAAiB,oBAAoB,MAAM,SAAS,aAAa;AACnE,cAAQ,IAAIA,QAAM,OAAO,sBAAsB,QAAQ,IAAI,EAAE,CAAC;AAC9D,cAAQ,WAAW;AACnB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;;;AClCA,SAAS,gBAAAC,qBAAoB;AAC7B,OAAOC,WAAU;AAaV,SAAS,kBAAkB,UAA6B;AAC7D,QAAM,WAAWA,MAAK,QAAQ,QAAQ;AACtC,QAAM,MAAMD,cAAa,UAAU,MAAM;AACzC,QAAM,MAAMC,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAE/C,MAAI,QAAQ,YAAY,QAAQ,WAAW;AACzC,WAAO,WAAW,GAAG;AAAA,EACvB;AACA,MAAI,QAAQ,SAAS;AACnB,WAAO,UAAU,GAAG;AAAA,EACtB;AAGA,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,KAAK,GAAG;AAC/E,WAAO,WAAW,GAAG;AAAA,EACvB;AACA,SAAO,UAAU,GAAG;AACtB;AAEA,SAAS,UAAU,KAAwB;AACzC,QAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,QAAM,aAAoC,MAAM,QAAQ,MAAM,IAC1D,SACA,mBAAmB,MAAM,IACvB,OAAO,WACP;AACN,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,QAAM,SAAoB,CAAC;AAC3B,aAAW,CAAC,OAAO,SAAS,KAAK,WAAW,QAAQ,GAAG;AACrD,oBAAgB,WAAW,SAAS,KAAK,EAAE;AAC3C,WAAO,KAAK,SAAS;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAwB;AAC1C,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,QAAM,WAAsB,CAAC;AAC7B,aAAW,CAAC,GAAG,KAAK,KAAK,MAAM,QAAQ,GAAG;AACxC,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,CAAC,KAAM;AACX,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,mBAAmB,OAAO,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IAC9E;AACA,oBAAgB,QAAQ,QAAQ,IAAI,CAAC,EAAE;AACvC,aAAS,KAAK,MAAM;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAkD;AAC5E,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,MAAM,QAAQ,OAAO,QAAQ;AACtC;AAEA,SAAS,gBAAgB,OAAgB,OAAyC;AAChF,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,IAAI,MAAM,GAAG,KAAK,iBAAiB;AAAA,EAC3C;AACA,QAAM,SAAS;AACf,MAAI,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,WAAW,GAAG;AACnE,UAAM,IAAI,MAAM,GAAG,KAAK,iCAAiC;AAAA,EAC3D;AACA,MAAI,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,WAAW,GAAG;AACjE,UAAM,IAAI,MAAM,GAAG,KAAK,gCAAgC;AAAA,EAC1D;AACF;;;ACvFA,SAAS,4BAA4B;AACrC,OAAOC,aAAW;AAyBlB,IAAM,qBAAqB;AAE3B,SAAS,kBAAkB,OAAe,QAAkB,KAAa,OAAoC;AAC3G,UAAQ,IAAI,MAAM,KAAK,CAAC;AACxB,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG,GAAG;AACvC,YAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,EACzB;AACA,MAAI,OAAO,SAAS,KAAK;AACvB,YAAQ,IAAIC,QAAM,KAAK,aAAa,OAAO,SAAS,GAAG,OAAO,CAAC;AAAA,EACjE;AACF;AAMA,eAAe,cAAc,UAAuC;AAClE,QAAM,aAAuB,CAAC;AAC9B,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAE,MAAM,qBAAqB,OAAO,EAAI,YAAW,KAAK,QAAQ,KAAK;AAAA,EAC3E;AACA,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,IAAIA,QAAM,KAAK,YAAY,SAAS,MAAM,yCAAyC,CAAC;AAC5F,WAAO;AAAA,EACT;AACA;AAAA,IACE,qBAAqB,WAAW,MAAM;AAAA,IACtC;AAAA,IACA;AAAA,IACAA,QAAM;AAAA,EACR;AACA,UAAQ,WAAW;AACnB,SAAO;AACT;AAOA,eAAsB,aAAa,SAA6C;AAC9E,QAAM,WAAW,kBAAkB,QAAQ,IAAI;AAC/C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAIA,QAAM,OAAO,GAAG,QAAQ,IAAI,8CAAyC,CAAC;AAClF;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,CAAE,MAAM,cAAc,QAAQ,EAAI;AAExD,QAAM,aAAa,MAAM,eAAe;AAAA,IACtC,UAAU,QAAQ;AAAA,IAAU,MAAM;AAAA,IAAU,WAAW,QAAQ;AAAA,EACjE,CAAC;AACD,UAAQ,IAAIA,QAAM;AAAA,IAChB,WAAW,SAAS,MAAM,gBAAgB,WAAW,YAAY,KAC3D,WAAW,UAAU,SAAS,WAAW,SAAS;AAAA,EAC1D,CAAC;AAED,QAAM,YAAY,QAAQ,aAAa;AACvC,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,QAAM,WAAqB,CAAC;AAE5B,WAAS,SAAS,GAAG,SAAS,SAAS,QAAQ,UAAU,WAAW;AAClE,UAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,SAAS;AACvD,UAAM,SAAS,MAAM,WAAW,OAAO,OAAO,KAAK;AACnD,gBAAY,OAAO;AACnB,kBAAc,OAAO;AACrB,aAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,EAClC;AAEA,UAAQ,IAAIA,QAAM;AAAA,IAChB,2BAA2B,QAAQ,eAAe,UAAU,aAAa,SAAS,MAAM;AAAA,EAC1F,CAAC;AACD,MAAI,SAAS,SAAS,GAAG;AACvB,sBAAkB,oBAAoB,UAAU,IAAIA,QAAM,MAAM;AAAA,EAClE;AACF;;;ACvGA,OAAOC,aAAW;AAoBlB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AAOxB,eAAsB,aAAa,SAA6C;AAC9E,QAAM,aAAa,MAAM,eAAe,EAAE,UAAU,QAAQ,UAAU,MAAM,SAAS,CAAC;AACtF,QAAM,QAAQ,QAAQ,SAAS;AAE/B,MAAI,SAAS,QAAQ;AACrB,MAAI,YAAY;AAIhB,SAAO,MAAM;AACX,UAAM,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,MACxC;AAAA,MAAO;AAAA,MAAQ,SAAS,QAAQ;AAAA,IAClC,CAAC;AACD,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,OAAO;AACpB,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,cAAc,GAAG;AACnB,gBAAQ,IAAIC,QAAM,OAAO,GAAG,WAAW,YAAY,mBAAmB,CAAC;AAAA,MACzE;AACA;AAAA,IACF;AACA,QAAI,KAAK,SAAS,SAAS,OAAO;AAChC,eAAS,KAAK,cAAc;AAC5B;AAAA,IACF;AACA,aAAS,KAAK,cAAc;AAAA,EAC9B;AAEA,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,UAAQ,IAAIA,QAAM,KAAK,aAAa,WAAW,YAAY,mBAAmB,CAAC;AAE/E,MAAI,QAAQ;AACZ,SAAO,QAAQ,aAAa,UAAa,QAAQ,QAAQ,UAAU;AACjE,UAAMC,OAAM,cAAc;AAC1B,aAAS;AACT,UAAM,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,MACxC;AAAA,MAAO;AAAA,MAAQ,SAAS,QAAQ;AAAA,IAClC,CAAC;AACD,eAAW,WAAW,KAAK,UAAU;AACnC,mBAAa,OAAO;AACpB,mBAAa;AAAA,IACf;AACA,QAAI,KAAK,WAAY,UAAS,KAAK;AAAA,EACrC;AACF;AAEA,SAAS,aAAa,SAAkD;AACtE,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAQ,IAAI,GAAGD,QAAM,KAAK,SAAS,CAAC,IAAIA,QAAM,KAAK,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,IAAIA,QAAM,QAAQ,QAAQ,MAAM,CAAC,EAAE;AACjH,UAAQ,IAAI,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAC5C;AAEA,SAASC,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;;;AChFO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,OAAO;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,aAAa;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,KAAK,KAAK;AAAA,MACV,QAAQ,KAAK,SAAS;AAAA,IACxB,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,WAAW,aAAa;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS,CAAC,UAAU,QAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,kBAAkB;AAAA,IACxB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,YAAY;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,eAAe,KAAK,gBAAgB;AAAA,IACtC,CAAC;AAAA,EACH;AACF;;;ACpCO,IAAM,sBAAqC;AAAA,EAChD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,YAAY;AACnB,UAAM,cAAc;AAAA,EACtB;AACF;;;ACNO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,OAAO,YAAY;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,MAAM;AAAA,MACV,SAAS,KAAK,UAAU;AAAA,MACxB,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;;;ACnBO,IAAM,wBAAuC;AAAA,EAClD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,YAAY;AACnB,UAAM,OAAO;AAAA,EACf;AACF;;;ACNO,IAAM,sBAAqC;AAAA,EAChD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,cAAc;AAAA,IACpB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,aAAa;AAAA,MACjB,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,WAAW,KAAK,YAAY;AAAA,MAC5B,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK,SAAS;AAAA,IACxB,CAAC;AAAA,EACH;AACF;;;ACtCO,IAAM,wBAAuC;AAAA,EAClD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC,EACA,WAAW,aAAa;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,aAAa;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AACF;;;ACrBO,IAAM,sBAAqC;AAAA,EAChD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,SAAS;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,UAAU;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,WAAW;AAAA,IACjB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,iBAAiB;AAAA,IACvB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,aAAa;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK,UAAW,KAAK,QAAmB,MAAM,GAAG,IAAI;AAAA,MAC9D,gBAAgB,KAAK,eAAe;AAAA,IACtC,CAAC;AAAA,EACH;AACF;;;AC3CO,IAAM,uBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,WAAW,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,SAAS,CAAC,UAAU,QAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC,EACA,OAAO,OAAO;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACL,SAAS,OAAO,SAAS;AACvB,UAAM,UAAU;AAAA,MACd,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC5BO,IAAM,qBAAoC;AAAA,EAC/C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MAAM,WAAW,QAAQ;AAAA,IACvB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAAA,EACH,SAAS,OAAO,SAAS;AACvB,UAAM,YAAY,KAAK,IAA0B;AAAA,EACnD;AACF;;;ACGO,IAAM,kBAAiC;AAAA,EAC5C,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,WACP,MACG,QAAQ,oBAAoB,EAC5B,QAAQ,qBAAqB,EAC7B,QAAQ,qBAAqB,EAC7B,QAAQ,mBAAmB,EAC3B,QAAQ,uBAAuB,EAC/B,QAAQ,sBAAsB,EAC9B,QAAQ,oBAAoB,EAC5B,QAAQ,qBAAqB,EAC7B,QAAQ,oBAAoB,EAC5B,QAAQ,kBAAkB,EAC1B,QAAQ,mBAAmB,EAC3B,QAAQ,oBAAoB,EAC5B,QAAQ,mBAAmB,EAC3B,QAAQ,oBAAoB,EAC5B,QAAQ,kBAAkB,EAC1B,cAAc,CAAC,EACf,eAAe;AAAA;AAAA,EAEpB,SAAS,MAAM;AAAA,EAAC;AAClB;","names":["path","path","files","createDatalakeClient","chalk","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","createDatalakeClient","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","chalk","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","createDatalakeClient","chalk","clearCredentials","chalk","existsSync","unlinkSync","existsSync","unlinkSync","chalk","clearCredentials","spawn","existsSync","readFileSync","chalk","existsSync","chalk","spawn","readFileSync","existsSync","chalk","existsSync","chalk","chalk","chalk","spawn","existsSync","mkdirSync","path","saveCredentials","chalk","existsSync","path","require","delay","path","existsSync","mkdirSync","spawn","chalk","saveCredentials","chalk","chalk","readFileSync","path","chalk","chalk","chalk","chalk","delay"]}
@@ -0,0 +1,189 @@
1
+ // src/commands/datalakeCreateCommand.ts
2
+ import { DATALAKE_REGIONS, DATALAKE_TIERS } from "@xylabs/aries-datalake-core";
3
+
4
+ // src/actions/datalake/createDatalake.ts
5
+ import { createDatalakeClient } from "@xylabs/aries-datalake-client";
6
+ import chalk2 from "chalk";
7
+
8
+ // src/actions/datalake/formatters.ts
9
+ import chalk from "chalk";
10
+ var STATUS_COLORS = {
11
+ pending: chalk.gray,
12
+ provisioning: chalk.yellow,
13
+ ready: chalk.green,
14
+ resizing: chalk.yellow,
15
+ deprovisioning: chalk.yellow,
16
+ deleted: chalk.gray,
17
+ error: chalk.red
18
+ };
19
+ function formatBytes(bytes) {
20
+ if (bytes < 1024) return `${bytes} B`;
21
+ if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`;
22
+ if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`;
23
+ if (bytes < 1024 ** 4) return `${(bytes / 1024 ** 3).toFixed(1)} GB`;
24
+ return `${(bytes / 1024 ** 4).toFixed(1)} TB`;
25
+ }
26
+ function formatStatus(status) {
27
+ const colorize = STATUS_COLORS[status] ?? chalk.white;
28
+ return colorize(status);
29
+ }
30
+ function printRateLimits(limits) {
31
+ const parts = [];
32
+ if (limits.authenticatedPerMinute !== void 0) parts.push(`auth=${limits.authenticatedPerMinute}/min`);
33
+ if (limits.anonymousPerMinute !== void 0) parts.push(`anon=${limits.anonymousPerMinute}/min`);
34
+ if (limits.burstFactor !== void 0) parts.push(`burst=${limits.burstFactor}x`);
35
+ if (parts.length > 0) {
36
+ console.log(` ${chalk.gray("limits:")} ${parts.join(" ")}`);
37
+ }
38
+ }
39
+ function printUsage(usage) {
40
+ console.log();
41
+ console.log(chalk.cyan(" usage"));
42
+ console.log(` ${chalk.gray("payloads:")} ${usage.payloadCount}`);
43
+ console.log(` ${chalk.gray("stored:")} ${formatBytes(usage.bytesStored)} / ${formatBytes(usage.bytesStoredLimit)}`);
44
+ console.log(` ${chalk.gray("reads 24h:")} ${usage.readsLast24h}`);
45
+ console.log(` ${chalk.gray("writes 24h:")} ${usage.writesLast24h}`);
46
+ }
47
+ function printAcl(acl) {
48
+ if (acl.length === 0) return;
49
+ console.log();
50
+ console.log(chalk.cyan(" access"));
51
+ for (const entry of acl) {
52
+ const principal = entry.principal === "public" ? chalk.yellow("public") : entry.principal;
53
+ console.log(` ${principal.padEnd(24)} ${chalk.magenta(entry.role)} ${chalk.gray(entry.grantedAt)}`);
54
+ }
55
+ }
56
+ function printDatalakeDetail(datalake) {
57
+ console.log(chalk.cyan(`
58
+ ${datalake.name}`));
59
+ console.log(` ${chalk.gray("id:")} ${datalake.id}`);
60
+ console.log(` ${chalk.gray("status:")} ${formatStatus(datalake.status)}`);
61
+ if (datalake.url) {
62
+ console.log(` ${chalk.gray("url:")} ${datalake.url}`);
63
+ }
64
+ console.log(` ${chalk.gray("owner:")} ${datalake.ownerId}`);
65
+ console.log(` ${chalk.gray("tier:")} ${datalake.config.tier}`);
66
+ console.log(` ${chalk.gray("region:")} ${datalake.config.region ?? "\u2014"}`);
67
+ console.log(` ${chalk.gray("size:")} ${datalake.config.sizeBytes ? formatBytes(datalake.config.sizeBytes) : "\u2014"}`);
68
+ console.log(` ${chalk.gray("iops:")} ${datalake.config.iops ?? "\u2014"}`);
69
+ console.log(` ${chalk.gray("retention:")} ${datalake.config.retentionDays ?? "forever"}`);
70
+ if (datalake.config.verifyHashes) {
71
+ console.log(` ${chalk.gray("verify:")} ${chalk.green("hashes enforced")}`);
72
+ }
73
+ if (datalake.config.rateLimits) printRateLimits(datalake.config.rateLimits);
74
+ console.log(` ${chalk.gray("created:")} ${datalake.createdAt}`);
75
+ console.log(` ${chalk.gray("updated:")} ${datalake.updatedAt}`);
76
+ if (datalake.usage) printUsage(datalake.usage);
77
+ printAcl(datalake.acl);
78
+ if (datalake.errorMessage) {
79
+ console.log();
80
+ console.log(` ${chalk.red("error:")} ${datalake.errorMessage}`);
81
+ }
82
+ }
83
+
84
+ // src/actions/datalake/parseSize.ts
85
+ var SIZE_UNITS = {
86
+ b: 1,
87
+ kb: 1024,
88
+ mb: 1024 ** 2,
89
+ gb: 1024 ** 3,
90
+ tb: 1024 ** 4
91
+ };
92
+ function parseSize(input) {
93
+ const match = /^(\d+(?:\.\d+)?)\s*([a-zA-Z]+)?$/.exec(input.trim());
94
+ if (!match) throw new Error(`Invalid size: ${input}`);
95
+ const value = Number(match[1]);
96
+ const unitRaw = (match[2] ?? "b").toLowerCase();
97
+ const unit = SIZE_UNITS[unitRaw];
98
+ if (unit === void 0) throw new Error(`Unknown size unit: ${match[2]}`);
99
+ return Math.round(value * unit);
100
+ }
101
+
102
+ // src/actions/datalake/createDatalake.ts
103
+ function buildRateLimits(options) {
104
+ if (options.rateAuthPerMinute === void 0 && options.rateAnonPerMinute === void 0 && options.rateBurstFactor === void 0) return void 0;
105
+ return {
106
+ authenticatedPerMinute: options.rateAuthPerMinute,
107
+ anonymousPerMinute: options.rateAnonPerMinute,
108
+ burstFactor: options.rateBurstFactor
109
+ };
110
+ }
111
+ async function createDatalake(options) {
112
+ const client = createDatalakeClient();
113
+ const config = {
114
+ tier: options.tier,
115
+ sizeBytes: options.size === void 0 ? void 0 : parseSize(options.size),
116
+ iops: options.iops,
117
+ region: options.region,
118
+ retentionDays: options.retentionDays,
119
+ verifyHashes: options.verifyHashes,
120
+ rateLimits: buildRateLimits(options)
121
+ };
122
+ console.log(chalk2.gray(`provisioning ${options.name} (tier=${options.tier})...`));
123
+ const descriptor = await client.create({ name: options.name, config });
124
+ console.log(chalk2.green(`created ${descriptor.name} (${descriptor.id})`));
125
+ printDatalakeDetail(descriptor);
126
+ }
127
+
128
+ // src/commands/datalakeCreateCommand.ts
129
+ var datalakeCreateCommand = {
130
+ command: "create <name>",
131
+ describe: "Provision a new datalake",
132
+ builder: (yargs) => yargs.positional("name", {
133
+ type: "string",
134
+ describe: "Human-friendly name (unique per owner)",
135
+ demandOption: true
136
+ }).option("tier", {
137
+ alias: "t",
138
+ type: "string",
139
+ choices: DATALAKE_TIERS,
140
+ default: "small",
141
+ describe: "Service tier"
142
+ }).option("size", {
143
+ alias: "s",
144
+ type: "string",
145
+ describe: "Capacity (e.g. 10GB, 100GB, 1TB)"
146
+ }).option("iops", {
147
+ type: "number",
148
+ describe: "Provisioned IOPS target"
149
+ }).option("region", {
150
+ alias: "r",
151
+ type: "string",
152
+ choices: DATALAKE_REGIONS,
153
+ describe: "Deployment region"
154
+ }).option("retention-days", {
155
+ type: "number",
156
+ describe: "Retention in days (omit for tier default)"
157
+ }).option("verify-hashes", {
158
+ type: "boolean",
159
+ default: false,
160
+ describe: "Reject inserts whose $hash does not match the content digest"
161
+ }).option("rate-auth-per-minute", {
162
+ type: "number",
163
+ describe: "Override: authenticated requests per minute"
164
+ }).option("rate-anon-per-minute", {
165
+ type: "number",
166
+ describe: "Override: anonymous requests per minute"
167
+ }).option("rate-burst-factor", {
168
+ type: "number",
169
+ describe: "Override: rate-limit burst factor (1 = no burst)"
170
+ }),
171
+ handler: async (argv) => {
172
+ await createDatalake({
173
+ name: argv.name,
174
+ tier: argv.tier,
175
+ size: argv.size,
176
+ iops: argv.iops,
177
+ region: argv.region,
178
+ retentionDays: argv["retention-days"],
179
+ verifyHashes: argv["verify-hashes"],
180
+ rateAuthPerMinute: argv["rate-auth-per-minute"],
181
+ rateAnonPerMinute: argv["rate-anon-per-minute"],
182
+ rateBurstFactor: argv["rate-burst-factor"]
183
+ });
184
+ }
185
+ };
186
+ export {
187
+ datalakeCreateCommand
188
+ };
189
+ //# sourceMappingURL=datalakeCreateCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/datalakeCreateCommand.ts","../../src/actions/datalake/createDatalake.ts","../../src/actions/datalake/formatters.ts","../../src/actions/datalake/parseSize.ts"],"sourcesContent":["import type { DatalakeRegion, DatalakeTier } from '@xylabs/aries-datalake-core'\nimport { DATALAKE_REGIONS, DATALAKE_TIERS } from '@xylabs/aries-datalake-core'\nimport type { CommandModule } from 'yargs'\n\nimport { createDatalake } from '../actions/datalake/index.ts'\n\nexport const datalakeCreateCommand: CommandModule = {\n command: 'create <name>',\n describe: 'Provision a new datalake',\n builder: yargs =>\n yargs\n .positional('name', {\n type: 'string',\n describe: 'Human-friendly name (unique per owner)',\n demandOption: true,\n })\n .option('tier', {\n alias: 't',\n type: 'string',\n choices: DATALAKE_TIERS,\n default: 'small',\n describe: 'Service tier',\n })\n .option('size', {\n alias: 's',\n type: 'string',\n describe: 'Capacity (e.g. 10GB, 100GB, 1TB)',\n })\n .option('iops', {\n type: 'number',\n describe: 'Provisioned IOPS target',\n })\n .option('region', {\n alias: 'r',\n type: 'string',\n choices: DATALAKE_REGIONS,\n describe: 'Deployment region',\n })\n .option('retention-days', {\n type: 'number',\n describe: 'Retention in days (omit for tier default)',\n })\n .option('verify-hashes', {\n type: 'boolean',\n default: false,\n describe: 'Reject inserts whose $hash does not match the content digest',\n })\n .option('rate-auth-per-minute', {\n type: 'number',\n describe: 'Override: authenticated requests per minute',\n })\n .option('rate-anon-per-minute', {\n type: 'number',\n describe: 'Override: anonymous requests per minute',\n })\n .option('rate-burst-factor', {\n type: 'number',\n describe: 'Override: rate-limit burst factor (1 = no burst)',\n }),\n handler: async (argv) => {\n await createDatalake({\n name: argv.name as string,\n tier: argv.tier as DatalakeTier,\n size: argv.size as string | undefined,\n iops: argv.iops as number | undefined,\n region: argv.region as DatalakeRegion | undefined,\n retentionDays: argv['retention-days'] as number | undefined,\n verifyHashes: argv['verify-hashes'] as boolean,\n rateAuthPerMinute: argv['rate-auth-per-minute'] as number | undefined,\n rateAnonPerMinute: argv['rate-anon-per-minute'] as number | undefined,\n rateBurstFactor: argv['rate-burst-factor'] as number | undefined,\n })\n },\n}\n","import { createDatalakeClient } from '@xylabs/aries-datalake-client'\nimport type {\n DatalakeConfig, DatalakeRegion, DatalakeTier, RateLimitOverrides,\n} from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nimport { printDatalakeDetail } from './formatters.ts'\nimport { parseSize } from './parseSize.ts'\n\nexport interface CreateDatalakeOptions {\n name: string\n tier: DatalakeTier\n size?: string\n iops?: number\n region?: DatalakeRegion\n retentionDays?: number\n verifyHashes?: boolean\n rateAuthPerMinute?: number\n rateAnonPerMinute?: number\n rateBurstFactor?: number\n}\n\nfunction buildRateLimits(options: CreateDatalakeOptions): RateLimitOverrides | undefined {\n if (\n options.rateAuthPerMinute === undefined\n && options.rateAnonPerMinute === undefined\n && options.rateBurstFactor === undefined\n ) return undefined\n return {\n authenticatedPerMinute: options.rateAuthPerMinute,\n anonymousPerMinute: options.rateAnonPerMinute,\n burstFactor: options.rateBurstFactor,\n }\n}\n\nexport async function createDatalake(options: CreateDatalakeOptions): Promise<void> {\n const client = createDatalakeClient()\n const config: DatalakeConfig = {\n tier: options.tier,\n sizeBytes: options.size === undefined ? undefined : parseSize(options.size),\n iops: options.iops,\n region: options.region,\n retentionDays: options.retentionDays,\n verifyHashes: options.verifyHashes,\n rateLimits: buildRateLimits(options),\n }\n\n console.log(chalk.gray(`provisioning ${options.name} (tier=${options.tier})...`))\n const descriptor = await client.create({ name: options.name, config })\n console.log(chalk.green(`created ${descriptor.name} (${descriptor.id})`))\n printDatalakeDetail(descriptor)\n}\n","import type {\n DatalakeDescriptor, DatalakeStatus, DatalakeUsage, RateLimitOverrides,\n} from '@xylabs/aries-datalake-core'\nimport chalk from 'chalk'\n\nconst STATUS_COLORS: Record<DatalakeStatus, (s: string) => string> = {\n pending: chalk.gray,\n provisioning: chalk.yellow,\n ready: chalk.green,\n resizing: chalk.yellow,\n deprovisioning: chalk.yellow,\n deleted: chalk.gray,\n error: chalk.red,\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 ** 2) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 ** 3) return `${(bytes / 1024 ** 2).toFixed(1)} MB`\n if (bytes < 1024 ** 4) return `${(bytes / 1024 ** 3).toFixed(1)} GB`\n return `${(bytes / 1024 ** 4).toFixed(1)} TB`\n}\n\nexport function formatStatus(status: DatalakeStatus): string {\n const colorize = STATUS_COLORS[status] ?? chalk.white\n return colorize(status)\n}\n\nexport function printDatalakeRow(datalake: DatalakeDescriptor): void {\n const size = datalake.config.sizeBytes ? formatBytes(datalake.config.sizeBytes) : '—'\n const name = chalk.white(datalake.name.padEnd(20))\n const tier = chalk.cyan(datalake.config.tier.padEnd(8))\n const region = chalk.gray((datalake.config.region ?? '—').padEnd(12))\n const status = formatStatus(datalake.status).padEnd(14)\n console.log(` ${name} ${tier} ${region} ${size.padStart(8)} ${status}`)\n}\n\nfunction printRateLimits(limits: RateLimitOverrides): void {\n const parts: string[] = []\n if (limits.authenticatedPerMinute !== undefined) parts.push(`auth=${limits.authenticatedPerMinute}/min`)\n if (limits.anonymousPerMinute !== undefined) parts.push(`anon=${limits.anonymousPerMinute}/min`)\n if (limits.burstFactor !== undefined) parts.push(`burst=${limits.burstFactor}x`)\n if (parts.length > 0) {\n console.log(` ${chalk.gray('limits:')} ${parts.join(' ')}`)\n }\n}\n\nfunction printUsage(usage: DatalakeUsage): void {\n console.log()\n console.log(chalk.cyan(' usage'))\n console.log(` ${chalk.gray('payloads:')} ${usage.payloadCount}`)\n console.log(` ${chalk.gray('stored:')} ${formatBytes(usage.bytesStored)} / ${formatBytes(usage.bytesStoredLimit)}`)\n console.log(` ${chalk.gray('reads 24h:')} ${usage.readsLast24h}`)\n console.log(` ${chalk.gray('writes 24h:')} ${usage.writesLast24h}`)\n}\n\nfunction printAcl(acl: DatalakeDescriptor['acl']): void {\n if (acl.length === 0) return\n console.log()\n console.log(chalk.cyan(' access'))\n for (const entry of acl) {\n const principal = entry.principal === 'public' ? chalk.yellow('public') : entry.principal\n console.log(` ${principal.padEnd(24)} ${chalk.magenta(entry.role)} ${chalk.gray(entry.grantedAt)}`)\n }\n}\n\nexport function printDatalakeDetail(datalake: DatalakeDescriptor): void {\n console.log(chalk.cyan(`\\n${datalake.name}`))\n console.log(` ${chalk.gray('id:')} ${datalake.id}`)\n console.log(` ${chalk.gray('status:')} ${formatStatus(datalake.status)}`)\n if (datalake.url) {\n console.log(` ${chalk.gray('url:')} ${datalake.url}`)\n }\n console.log(` ${chalk.gray('owner:')} ${datalake.ownerId}`)\n console.log(` ${chalk.gray('tier:')} ${datalake.config.tier}`)\n console.log(` ${chalk.gray('region:')} ${datalake.config.region ?? '—'}`)\n console.log(` ${chalk.gray('size:')} ${datalake.config.sizeBytes ? formatBytes(datalake.config.sizeBytes) : '—'}`)\n console.log(` ${chalk.gray('iops:')} ${datalake.config.iops ?? '—'}`)\n console.log(` ${chalk.gray('retention:')} ${datalake.config.retentionDays ?? 'forever'}`)\n if (datalake.config.verifyHashes) {\n console.log(` ${chalk.gray('verify:')} ${chalk.green('hashes enforced')}`)\n }\n if (datalake.config.rateLimits) printRateLimits(datalake.config.rateLimits)\n console.log(` ${chalk.gray('created:')} ${datalake.createdAt}`)\n console.log(` ${chalk.gray('updated:')} ${datalake.updatedAt}`)\n if (datalake.usage) printUsage(datalake.usage)\n printAcl(datalake.acl)\n if (datalake.errorMessage) {\n console.log()\n console.log(` ${chalk.red('error:')} ${datalake.errorMessage}`)\n }\n}\n","const SIZE_UNITS: Record<string, number> = {\n b: 1,\n kb: 1024,\n mb: 1024 ** 2,\n gb: 1024 ** 3,\n tb: 1024 ** 4,\n}\n\n/**\n * Parse human-readable sizes like \"10GB\", \"500MB\", \"1tb\" into bytes.\n * Throws on unrecognized input so the CLI surfaces a clear error.\n */\nexport function parseSize(input: string): number {\n const match = /^(\\d+(?:\\.\\d+)?)\\s*([a-zA-Z]+)?$/.exec(input.trim())\n if (!match) throw new Error(`Invalid size: ${input}`)\n const value = Number(match[1])\n const unitRaw = (match[2] ?? 'b').toLowerCase()\n const unit = SIZE_UNITS[unitRaw]\n if (unit === undefined) throw new Error(`Unknown size unit: ${match[2]}`)\n return Math.round(value * unit)\n}\n"],"mappings":"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","names":["chalk","chalk"]}