takomusic 1.2.0

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 (335) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +230 -0
  3. package/dist/__tests__/checker.test.d.ts +2 -0
  4. package/dist/__tests__/checker.test.d.ts.map +1 -0
  5. package/dist/__tests__/checker.test.js +316 -0
  6. package/dist/__tests__/checker.test.js.map +1 -0
  7. package/dist/__tests__/compiler.test.d.ts +2 -0
  8. package/dist/__tests__/compiler.test.d.ts.map +1 -0
  9. package/dist/__tests__/compiler.test.js +260 -0
  10. package/dist/__tests__/compiler.test.js.map +1 -0
  11. package/dist/__tests__/generators.test.d.ts +2 -0
  12. package/dist/__tests__/generators.test.d.ts.map +1 -0
  13. package/dist/__tests__/generators.test.js +283 -0
  14. package/dist/__tests__/generators.test.js.map +1 -0
  15. package/dist/__tests__/interpreter.test.d.ts +2 -0
  16. package/dist/__tests__/interpreter.test.d.ts.map +1 -0
  17. package/dist/__tests__/interpreter.test.js +298 -0
  18. package/dist/__tests__/interpreter.test.js.map +1 -0
  19. package/dist/__tests__/lexer.test.d.ts +2 -0
  20. package/dist/__tests__/lexer.test.d.ts.map +1 -0
  21. package/dist/__tests__/lexer.test.js +89 -0
  22. package/dist/__tests__/lexer.test.js.map +1 -0
  23. package/dist/__tests__/parser.test.d.ts +2 -0
  24. package/dist/__tests__/parser.test.d.ts.map +1 -0
  25. package/dist/__tests__/parser.test.js +116 -0
  26. package/dist/__tests__/parser.test.js.map +1 -0
  27. package/dist/checker/checker.d.ts +37 -0
  28. package/dist/checker/checker.d.ts.map +1 -0
  29. package/dist/checker/checker.js +428 -0
  30. package/dist/checker/checker.js.map +1 -0
  31. package/dist/checker/index.d.ts +3 -0
  32. package/dist/checker/index.d.ts.map +1 -0
  33. package/dist/checker/index.js +2 -0
  34. package/dist/checker/index.js.map +1 -0
  35. package/dist/cli/commands/build.d.ts +2 -0
  36. package/dist/cli/commands/build.d.ts.map +1 -0
  37. package/dist/cli/commands/build.js +173 -0
  38. package/dist/cli/commands/build.js.map +1 -0
  39. package/dist/cli/commands/check.d.ts +2 -0
  40. package/dist/cli/commands/check.d.ts.map +1 -0
  41. package/dist/cli/commands/check.js +79 -0
  42. package/dist/cli/commands/check.js.map +1 -0
  43. package/dist/cli/commands/doctor.d.ts +2 -0
  44. package/dist/cli/commands/doctor.d.ts.map +1 -0
  45. package/dist/cli/commands/doctor.js +187 -0
  46. package/dist/cli/commands/doctor.js.map +1 -0
  47. package/dist/cli/commands/fmt.d.ts +2 -0
  48. package/dist/cli/commands/fmt.d.ts.map +1 -0
  49. package/dist/cli/commands/fmt.js +73 -0
  50. package/dist/cli/commands/fmt.js.map +1 -0
  51. package/dist/cli/commands/import.d.ts +2 -0
  52. package/dist/cli/commands/import.d.ts.map +1 -0
  53. package/dist/cli/commands/import.js +99 -0
  54. package/dist/cli/commands/import.js.map +1 -0
  55. package/dist/cli/commands/init.d.ts +2 -0
  56. package/dist/cli/commands/init.d.ts.map +1 -0
  57. package/dist/cli/commands/init.js +514 -0
  58. package/dist/cli/commands/init.js.map +1 -0
  59. package/dist/cli/commands/play.d.ts +2 -0
  60. package/dist/cli/commands/play.d.ts.map +1 -0
  61. package/dist/cli/commands/play.js +216 -0
  62. package/dist/cli/commands/play.js.map +1 -0
  63. package/dist/cli/commands/record.d.ts +2 -0
  64. package/dist/cli/commands/record.d.ts.map +1 -0
  65. package/dist/cli/commands/record.js +393 -0
  66. package/dist/cli/commands/record.js.map +1 -0
  67. package/dist/cli/commands/render.d.ts +2 -0
  68. package/dist/cli/commands/render.d.ts.map +1 -0
  69. package/dist/cli/commands/render.js +278 -0
  70. package/dist/cli/commands/render.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +93 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/compiler/compiler.d.ts +12 -0
  76. package/dist/compiler/compiler.d.ts.map +1 -0
  77. package/dist/compiler/compiler.js +146 -0
  78. package/dist/compiler/compiler.js.map +1 -0
  79. package/dist/compiler/index.d.ts +2 -0
  80. package/dist/compiler/index.d.ts.map +1 -0
  81. package/dist/compiler/index.js +2 -0
  82. package/dist/compiler/index.js.map +1 -0
  83. package/dist/config/config.d.ts +43 -0
  84. package/dist/config/config.d.ts.map +1 -0
  85. package/dist/config/config.js +200 -0
  86. package/dist/config/config.js.map +1 -0
  87. package/dist/config/index.d.ts +2 -0
  88. package/dist/config/index.d.ts.map +1 -0
  89. package/dist/config/index.js +2 -0
  90. package/dist/config/index.js.map +1 -0
  91. package/dist/errors.d.ts +49 -0
  92. package/dist/errors.d.ts.map +1 -0
  93. package/dist/errors.js +168 -0
  94. package/dist/errors.js.map +1 -0
  95. package/dist/formatter/formatter.d.ts +13 -0
  96. package/dist/formatter/formatter.d.ts.map +1 -0
  97. package/dist/formatter/formatter.js +242 -0
  98. package/dist/formatter/formatter.js.map +1 -0
  99. package/dist/formatter/index.d.ts +2 -0
  100. package/dist/formatter/index.d.ts.map +1 -0
  101. package/dist/formatter/index.js +2 -0
  102. package/dist/formatter/index.js.map +1 -0
  103. package/dist/generators/index.d.ts +5 -0
  104. package/dist/generators/index.d.ts.map +1 -0
  105. package/dist/generators/index.js +5 -0
  106. package/dist/generators/index.js.map +1 -0
  107. package/dist/generators/midi.d.ts +3 -0
  108. package/dist/generators/midi.d.ts.map +1 -0
  109. package/dist/generators/midi.js +360 -0
  110. package/dist/generators/midi.js.map +1 -0
  111. package/dist/generators/musicxml.d.ts +3 -0
  112. package/dist/generators/musicxml.d.ts.map +1 -0
  113. package/dist/generators/musicxml.js +332 -0
  114. package/dist/generators/musicxml.js.map +1 -0
  115. package/dist/generators/tempo-midi.d.ts +3 -0
  116. package/dist/generators/tempo-midi.d.ts.map +1 -0
  117. package/dist/generators/tempo-midi.js +123 -0
  118. package/dist/generators/tempo-midi.js.map +1 -0
  119. package/dist/generators/vsqx.d.ts +3 -0
  120. package/dist/generators/vsqx.d.ts.map +1 -0
  121. package/dist/generators/vsqx.js +354 -0
  122. package/dist/generators/vsqx.js.map +1 -0
  123. package/dist/importers/index.d.ts +2 -0
  124. package/dist/importers/index.d.ts.map +1 -0
  125. package/dist/importers/index.js +3 -0
  126. package/dist/importers/index.js.map +1 -0
  127. package/dist/importers/musicxml.d.ts +4 -0
  128. package/dist/importers/musicxml.d.ts.map +1 -0
  129. package/dist/importers/musicxml.js +392 -0
  130. package/dist/importers/musicxml.js.map +1 -0
  131. package/dist/index.d.ts +11 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +12 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/interpreter/builtins/algorithmic.d.ts +12 -0
  136. package/dist/interpreter/builtins/algorithmic.d.ts.map +1 -0
  137. package/dist/interpreter/builtins/algorithmic.js +244 -0
  138. package/dist/interpreter/builtins/algorithmic.js.map +1 -0
  139. package/dist/interpreter/builtins/audio.d.ts +10 -0
  140. package/dist/interpreter/builtins/audio.d.ts.map +1 -0
  141. package/dist/interpreter/builtins/audio.js +169 -0
  142. package/dist/interpreter/builtins/audio.js.map +1 -0
  143. package/dist/interpreter/builtins/core.d.ts +15 -0
  144. package/dist/interpreter/builtins/core.d.ts.map +1 -0
  145. package/dist/interpreter/builtins/core.js +265 -0
  146. package/dist/interpreter/builtins/core.js.map +1 -0
  147. package/dist/interpreter/builtins/dynamics.d.ts +8 -0
  148. package/dist/interpreter/builtins/dynamics.d.ts.map +1 -0
  149. package/dist/interpreter/builtins/dynamics.js +86 -0
  150. package/dist/interpreter/builtins/dynamics.js.map +1 -0
  151. package/dist/interpreter/builtins/effects.d.ts +16 -0
  152. package/dist/interpreter/builtins/effects.d.ts.map +1 -0
  153. package/dist/interpreter/builtins/effects.js +220 -0
  154. package/dist/interpreter/builtins/effects.js.map +1 -0
  155. package/dist/interpreter/builtins/index.d.ts +16 -0
  156. package/dist/interpreter/builtins/index.d.ts.map +1 -0
  157. package/dist/interpreter/builtins/index.js +17 -0
  158. package/dist/interpreter/builtins/index.js.map +1 -0
  159. package/dist/interpreter/builtins/layout.d.ts +12 -0
  160. package/dist/interpreter/builtins/layout.d.ts.map +1 -0
  161. package/dist/interpreter/builtins/layout.js +175 -0
  162. package/dist/interpreter/builtins/layout.js.map +1 -0
  163. package/dist/interpreter/builtins/live.d.ts +11 -0
  164. package/dist/interpreter/builtins/live.d.ts.map +1 -0
  165. package/dist/interpreter/builtins/live.js +125 -0
  166. package/dist/interpreter/builtins/live.js.map +1 -0
  167. package/dist/interpreter/builtins/midi.d.ts +16 -0
  168. package/dist/interpreter/builtins/midi.d.ts.map +1 -0
  169. package/dist/interpreter/builtins/midi.js +320 -0
  170. package/dist/interpreter/builtins/midi.js.map +1 -0
  171. package/dist/interpreter/builtins/mixing.d.ts +6 -0
  172. package/dist/interpreter/builtins/mixing.d.ts.map +1 -0
  173. package/dist/interpreter/builtins/mixing.js +62 -0
  174. package/dist/interpreter/builtins/mixing.js.map +1 -0
  175. package/dist/interpreter/builtins/notation.d.ts +24 -0
  176. package/dist/interpreter/builtins/notation.d.ts.map +1 -0
  177. package/dist/interpreter/builtins/notation.js +251 -0
  178. package/dist/interpreter/builtins/notation.js.map +1 -0
  179. package/dist/interpreter/builtins/ornaments.d.ts +8 -0
  180. package/dist/interpreter/builtins/ornaments.d.ts.map +1 -0
  181. package/dist/interpreter/builtins/ornaments.js +155 -0
  182. package/dist/interpreter/builtins/ornaments.js.map +1 -0
  183. package/dist/interpreter/builtins/techniques.d.ts +11 -0
  184. package/dist/interpreter/builtins/techniques.d.ts.map +1 -0
  185. package/dist/interpreter/builtins/techniques.js +234 -0
  186. package/dist/interpreter/builtins/techniques.js.map +1 -0
  187. package/dist/interpreter/builtins/tuning.d.ts +7 -0
  188. package/dist/interpreter/builtins/tuning.d.ts.map +1 -0
  189. package/dist/interpreter/builtins/tuning.js +52 -0
  190. package/dist/interpreter/builtins/tuning.js.map +1 -0
  191. package/dist/interpreter/builtins/types.d.ts +27 -0
  192. package/dist/interpreter/builtins/types.d.ts.map +1 -0
  193. package/dist/interpreter/builtins/types.js +3 -0
  194. package/dist/interpreter/builtins/types.js.map +1 -0
  195. package/dist/interpreter/builtins/vocaloid.d.ts +10 -0
  196. package/dist/interpreter/builtins/vocaloid.d.ts.map +1 -0
  197. package/dist/interpreter/builtins/vocaloid.js +165 -0
  198. package/dist/interpreter/builtins/vocaloid.js.map +1 -0
  199. package/dist/interpreter/index.d.ts +4 -0
  200. package/dist/interpreter/index.d.ts.map +1 -0
  201. package/dist/interpreter/index.js +4 -0
  202. package/dist/interpreter/index.js.map +1 -0
  203. package/dist/interpreter/interpreter.d.ts +305 -0
  204. package/dist/interpreter/interpreter.d.ts.map +1 -0
  205. package/dist/interpreter/interpreter.js +8463 -0
  206. package/dist/interpreter/interpreter.js.map +1 -0
  207. package/dist/interpreter/runtime.d.ts +67 -0
  208. package/dist/interpreter/runtime.d.ts.map +1 -0
  209. package/dist/interpreter/runtime.js +88 -0
  210. package/dist/interpreter/runtime.js.map +1 -0
  211. package/dist/interpreter/scope.d.ts +21 -0
  212. package/dist/interpreter/scope.d.ts.map +1 -0
  213. package/dist/interpreter/scope.js +60 -0
  214. package/dist/interpreter/scope.js.map +1 -0
  215. package/dist/interpreter/trackState.d.ts +205 -0
  216. package/dist/interpreter/trackState.d.ts.map +1 -0
  217. package/dist/interpreter/trackState.js +12 -0
  218. package/dist/interpreter/trackState.js.map +1 -0
  219. package/dist/lexer/index.d.ts +2 -0
  220. package/dist/lexer/index.d.ts.map +1 -0
  221. package/dist/lexer/index.js +2 -0
  222. package/dist/lexer/index.js.map +1 -0
  223. package/dist/lexer/lexer.d.ts +30 -0
  224. package/dist/lexer/lexer.d.ts.map +1 -0
  225. package/dist/lexer/lexer.js +385 -0
  226. package/dist/lexer/lexer.js.map +1 -0
  227. package/dist/parser/index.d.ts +2 -0
  228. package/dist/parser/index.d.ts.map +1 -0
  229. package/dist/parser/index.js +2 -0
  230. package/dist/parser/index.js.map +1 -0
  231. package/dist/parser/parser.d.ts +55 -0
  232. package/dist/parser/parser.d.ts.map +1 -0
  233. package/dist/parser/parser.js +896 -0
  234. package/dist/parser/parser.js.map +1 -0
  235. package/dist/types/ast.d.ts +220 -0
  236. package/dist/types/ast.d.ts.map +1 -0
  237. package/dist/types/ast.js +3 -0
  238. package/dist/types/ast.js.map +1 -0
  239. package/dist/types/index.d.ts +4 -0
  240. package/dist/types/index.d.ts.map +1 -0
  241. package/dist/types/index.js +4 -0
  242. package/dist/types/index.js.map +1 -0
  243. package/dist/types/ir/advanced.d.ts +491 -0
  244. package/dist/types/ir/advanced.d.ts.map +1 -0
  245. package/dist/types/ir/advanced.js +3 -0
  246. package/dist/types/ir/advanced.js.map +1 -0
  247. package/dist/types/ir/algorithmic.d.ts +48 -0
  248. package/dist/types/ir/algorithmic.d.ts.map +1 -0
  249. package/dist/types/ir/algorithmic.js +3 -0
  250. package/dist/types/ir/algorithmic.js.map +1 -0
  251. package/dist/types/ir/analysis.d.ts +34 -0
  252. package/dist/types/ir/analysis.d.ts.map +1 -0
  253. package/dist/types/ir/analysis.js +3 -0
  254. package/dist/types/ir/analysis.js.map +1 -0
  255. package/dist/types/ir/audio.d.ts +249 -0
  256. package/dist/types/ir/audio.d.ts.map +1 -0
  257. package/dist/types/ir/audio.js +3 -0
  258. package/dist/types/ir/audio.js.map +1 -0
  259. package/dist/types/ir/automation.d.ts +46 -0
  260. package/dist/types/ir/automation.d.ts.map +1 -0
  261. package/dist/types/ir/automation.js +3 -0
  262. package/dist/types/ir/automation.js.map +1 -0
  263. package/dist/types/ir/collaboration.d.ts +20 -0
  264. package/dist/types/ir/collaboration.d.ts.map +1 -0
  265. package/dist/types/ir/collaboration.js +3 -0
  266. package/dist/types/ir/collaboration.js.map +1 -0
  267. package/dist/types/ir/core.d.ts +153 -0
  268. package/dist/types/ir/core.d.ts.map +1 -0
  269. package/dist/types/ir/core.js +3 -0
  270. package/dist/types/ir/core.js.map +1 -0
  271. package/dist/types/ir/effects.d.ts +169 -0
  272. package/dist/types/ir/effects.d.ts.map +1 -0
  273. package/dist/types/ir/effects.js +3 -0
  274. package/dist/types/ir/effects.js.map +1 -0
  275. package/dist/types/ir/extended.d.ts +104 -0
  276. package/dist/types/ir/extended.d.ts.map +1 -0
  277. package/dist/types/ir/extended.js +3 -0
  278. package/dist/types/ir/extended.js.map +1 -0
  279. package/dist/types/ir/index.d.ts +16 -0
  280. package/dist/types/ir/index.d.ts.map +1 -0
  281. package/dist/types/ir/index.js +17 -0
  282. package/dist/types/ir/index.js.map +1 -0
  283. package/dist/types/ir/mastering.d.ts +86 -0
  284. package/dist/types/ir/mastering.d.ts.map +1 -0
  285. package/dist/types/ir/mastering.js +3 -0
  286. package/dist/types/ir/mastering.js.map +1 -0
  287. package/dist/types/ir/midi.d.ts +79 -0
  288. package/dist/types/ir/midi.d.ts.map +1 -0
  289. package/dist/types/ir/midi.js +3 -0
  290. package/dist/types/ir/midi.js.map +1 -0
  291. package/dist/types/ir/notation.d.ts +963 -0
  292. package/dist/types/ir/notation.d.ts.map +1 -0
  293. package/dist/types/ir/notation.js +3 -0
  294. package/dist/types/ir/notation.js.map +1 -0
  295. package/dist/types/ir/recording.d.ts +48 -0
  296. package/dist/types/ir/recording.d.ts.map +1 -0
  297. package/dist/types/ir/recording.js +3 -0
  298. package/dist/types/ir/recording.js.map +1 -0
  299. package/dist/types/ir/sampling.d.ts +59 -0
  300. package/dist/types/ir/sampling.d.ts.map +1 -0
  301. package/dist/types/ir/sampling.js +3 -0
  302. package/dist/types/ir/sampling.js.map +1 -0
  303. package/dist/types/ir/sequencing.d.ts +118 -0
  304. package/dist/types/ir/sequencing.d.ts.map +1 -0
  305. package/dist/types/ir/sequencing.js +3 -0
  306. package/dist/types/ir/sequencing.js.map +1 -0
  307. package/dist/types/ir/sync.d.ts +39 -0
  308. package/dist/types/ir/sync.d.ts.map +1 -0
  309. package/dist/types/ir/sync.js +3 -0
  310. package/dist/types/ir/sync.js.map +1 -0
  311. package/dist/types/ir.d.ts +2 -0
  312. package/dist/types/ir.d.ts.map +1 -0
  313. package/dist/types/ir.js +3 -0
  314. package/dist/types/ir.js.map +1 -0
  315. package/dist/types/token.d.ts +72 -0
  316. package/dist/types/token.d.ts.map +1 -0
  317. package/dist/types/token.js +90 -0
  318. package/dist/types/token.js.map +1 -0
  319. package/dist/utils/stdlib.d.ts +18 -0
  320. package/dist/utils/stdlib.d.ts.map +1 -0
  321. package/dist/utils/stdlib.js +51 -0
  322. package/dist/utils/stdlib.js.map +1 -0
  323. package/lib/articulation.mf +46 -0
  324. package/lib/composition.mf +299 -0
  325. package/lib/curves.mf +183 -0
  326. package/lib/dynamics.mf +141 -0
  327. package/lib/expression.mf +221 -0
  328. package/lib/genres.mf +348 -0
  329. package/lib/notation.mf +224 -0
  330. package/lib/ornaments.mf +98 -0
  331. package/lib/patterns.mf +170 -0
  332. package/lib/rhythm.mf +269 -0
  333. package/lib/theory.mf +257 -0
  334. package/lib/utils.mf +140 -0
  335. package/package.json +49 -0
@@ -0,0 +1,278 @@
1
+ // mf render command - render audio using external tools
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { spawn } from 'child_process';
5
+ import { ExitCodes } from '../../errors.js';
6
+ import { findConfigPath, loadConfig } from '../../config/index.js';
7
+ // Default timeout: 10 minutes
8
+ const DEFAULT_TIMEOUT = 10 * 60 * 1000;
9
+ // Track active process for cancellation
10
+ let activeProcess = null;
11
+ let cancelled = false;
12
+ // Handle Ctrl+C gracefully
13
+ function setupCancellationHandler() {
14
+ const handler = () => {
15
+ if (activeProcess) {
16
+ console.log('\nCancelling render...');
17
+ cancelled = true;
18
+ activeProcess.kill('SIGTERM');
19
+ // Force kill after 3 seconds if still running
20
+ setTimeout(() => {
21
+ if (activeProcess && !activeProcess.killed) {
22
+ activeProcess.kill('SIGKILL');
23
+ }
24
+ }, 3000);
25
+ }
26
+ };
27
+ process.on('SIGINT', handler);
28
+ process.on('SIGTERM', handler);
29
+ }
30
+ export async function renderCommand(args) {
31
+ // Parse arguments
32
+ let profile;
33
+ let timeout = DEFAULT_TIMEOUT;
34
+ let dryRun = false;
35
+ for (let i = 0; i < args.length; i++) {
36
+ if (args[i] === '-p' || args[i] === '--profile') {
37
+ profile = args[i + 1];
38
+ i++;
39
+ }
40
+ else if (args[i] === '-t' || args[i] === '--timeout') {
41
+ timeout = parseInt(args[i + 1], 10) * 1000; // Convert seconds to ms
42
+ i++;
43
+ }
44
+ else if (args[i] === '--dry-run') {
45
+ dryRun = true;
46
+ }
47
+ else if (args[i] === '-h' || args[i] === '--help') {
48
+ console.log(`Usage: mf render -p <profile|all> [options]
49
+
50
+ Options:
51
+ -p, --profile <name> Profile to render (cli, miku, or all)
52
+ -t, --timeout <sec> Timeout per command in seconds (default: 600)
53
+ --dry-run Show commands without executing
54
+ -h, --help Show this help message
55
+ `);
56
+ return ExitCodes.SUCCESS;
57
+ }
58
+ }
59
+ if (!profile) {
60
+ console.error('Profile required. Usage: mf render -p <profile|all>');
61
+ console.error('Use -h for more options.');
62
+ return ExitCodes.STATIC_ERROR;
63
+ }
64
+ // Setup cancellation handler
65
+ setupCancellationHandler();
66
+ // Find config
67
+ const configPath = findConfigPath(process.cwd());
68
+ if (!configPath) {
69
+ console.error('No mfconfig.toml found. Run "mf init" first.');
70
+ return ExitCodes.IO_ERROR;
71
+ }
72
+ const config = loadConfig(configPath);
73
+ const baseDir = path.dirname(configPath);
74
+ // Ensure out directory exists
75
+ const outDir = path.join(baseDir, config.project.out);
76
+ if (!fs.existsSync(outDir)) {
77
+ fs.mkdirSync(outDir, { recursive: true });
78
+ }
79
+ // Reset cancellation state
80
+ cancelled = false;
81
+ try {
82
+ if (profile === 'cli' || profile === 'all') {
83
+ const result = await renderCliProfile(config, baseDir, timeout, dryRun);
84
+ if (cancelled) {
85
+ console.log('Render cancelled by user.');
86
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
87
+ }
88
+ if (result !== ExitCodes.SUCCESS) {
89
+ return result;
90
+ }
91
+ }
92
+ if (profile === 'miku' || profile === 'all') {
93
+ const result = await renderMikuProfile(config, baseDir, timeout, dryRun);
94
+ if (cancelled) {
95
+ console.log('Render cancelled by user.');
96
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
97
+ }
98
+ if (result !== ExitCodes.SUCCESS) {
99
+ return result;
100
+ }
101
+ }
102
+ if (dryRun) {
103
+ console.log('\n[Dry run complete - no commands were executed]');
104
+ }
105
+ else {
106
+ console.log('Render complete.');
107
+ }
108
+ return ExitCodes.SUCCESS;
109
+ }
110
+ catch (err) {
111
+ if (cancelled) {
112
+ console.log('Render cancelled by user.');
113
+ }
114
+ else {
115
+ console.error(`Error: ${err.message}`);
116
+ }
117
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
118
+ }
119
+ }
120
+ async function renderCliProfile(config, baseDir, timeout, dryRun) {
121
+ const cliConfig = config.profiles.cli;
122
+ if (!cliConfig) {
123
+ console.log('CLI profile not configured, skipping.');
124
+ return ExitCodes.SUCCESS;
125
+ }
126
+ const outDir = path.join(baseDir, config.project.out);
127
+ // Template variables
128
+ const vars = {
129
+ '{musicxml}': path.join(baseDir, cliConfig.musicxmlOut),
130
+ '{mid}': path.join(baseDir, cliConfig.bandMidOut),
131
+ '{vocal_wav}': path.join(outDir, 'vocal.wav'),
132
+ '{band_wav}': path.join(outDir, 'band.wav'),
133
+ '{mix_wav}': path.join(baseDir, cliConfig.renderOut),
134
+ };
135
+ // Run vocal command
136
+ if (cliConfig.vocalCmd) {
137
+ console.log('[1/3] Running vocal synthesis...');
138
+ if (cancelled)
139
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
140
+ const result = await runCommand(cliConfig.vocalCmd, vars, timeout, dryRun);
141
+ if (result !== 0) {
142
+ if (cancelled)
143
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
144
+ console.error('Vocal synthesis failed.');
145
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
146
+ }
147
+ }
148
+ else {
149
+ console.log('[1/3] No vocal_cmd configured, skipping vocal synthesis.');
150
+ }
151
+ // Run MIDI command
152
+ if (cliConfig.midiCmd) {
153
+ console.log('[2/3] Running MIDI synthesis...');
154
+ if (cancelled)
155
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
156
+ const result = await runCommand(cliConfig.midiCmd, vars, timeout, dryRun);
157
+ if (result !== 0) {
158
+ if (cancelled)
159
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
160
+ console.error('MIDI synthesis failed.');
161
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
162
+ }
163
+ }
164
+ else {
165
+ console.log('[2/3] No midi_cmd configured, skipping MIDI synthesis.');
166
+ }
167
+ // Run mix command
168
+ if (cliConfig.mixCmd) {
169
+ console.log('[3/3] Running mix...');
170
+ if (cancelled)
171
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
172
+ const result = await runCommand(cliConfig.mixCmd, vars, timeout, dryRun);
173
+ if (result !== 0) {
174
+ if (cancelled)
175
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
176
+ console.error('Mix failed.');
177
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
178
+ }
179
+ }
180
+ else {
181
+ console.log('[3/3] No mix_cmd configured, skipping mix.');
182
+ }
183
+ return ExitCodes.SUCCESS;
184
+ }
185
+ async function renderMikuProfile(config, baseDir, timeout, dryRun) {
186
+ const mikuConfig = config.profiles.miku;
187
+ if (!mikuConfig) {
188
+ console.log('Miku profile not configured, skipping.');
189
+ return ExitCodes.SUCCESS;
190
+ }
191
+ if (mikuConfig.importStrategy === 'manual') {
192
+ console.log('');
193
+ console.log('=== Manual VSQX Import Required ===');
194
+ console.log(`1. Open your DAW project: ${mikuConfig.dawProject || '(not configured)'}`);
195
+ console.log(`2. Import VSQX file: ${mikuConfig.vsqxOut}`);
196
+ console.log(`3. Import tempo MIDI: ${mikuConfig.tempoMidOut}`);
197
+ console.log('4. Save the project');
198
+ console.log('5. Run the render command again (or render manually)');
199
+ console.log('');
200
+ if (!mikuConfig.dawExe) {
201
+ console.log('DAW executable not configured. Please render manually.');
202
+ return ExitCodes.SUCCESS;
203
+ }
204
+ }
205
+ // Run DAW render if configured
206
+ if (mikuConfig.dawExe && mikuConfig.dawArgs) {
207
+ const vars = {
208
+ '{project}': path.join(baseDir, mikuConfig.dawProject || ''),
209
+ '{vsqx}': path.join(baseDir, mikuConfig.vsqxOut),
210
+ '{tempo_mid}': path.join(baseDir, mikuConfig.tempoMidOut),
211
+ };
212
+ console.log('Running DAW render...');
213
+ if (cancelled)
214
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
215
+ const result = await runCommand([mikuConfig.dawExe, ...mikuConfig.dawArgs], vars, timeout, dryRun);
216
+ if (result !== 0) {
217
+ if (cancelled)
218
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
219
+ console.error('DAW render failed.');
220
+ return ExitCodes.EXTERNAL_TOOL_ERROR;
221
+ }
222
+ }
223
+ return ExitCodes.SUCCESS;
224
+ }
225
+ function runCommand(cmdTemplate, vars, timeout, dryRun) {
226
+ return new Promise((resolve) => {
227
+ // Replace template variables
228
+ const cmd = cmdTemplate.map((arg) => {
229
+ let result = arg;
230
+ for (const [key, value] of Object.entries(vars)) {
231
+ result = result.replace(key, value);
232
+ }
233
+ return result;
234
+ });
235
+ console.log(` > ${cmd.join(' ')}`);
236
+ // Dry run mode - just show the command
237
+ if (dryRun) {
238
+ console.log(' [dry-run: skipped]');
239
+ resolve(0);
240
+ return;
241
+ }
242
+ const startTime = Date.now();
243
+ const proc = spawn(cmd[0], cmd.slice(1), {
244
+ stdio: 'inherit',
245
+ shell: true,
246
+ });
247
+ activeProcess = proc;
248
+ // Setup timeout
249
+ const timeoutId = setTimeout(() => {
250
+ if (!proc.killed) {
251
+ console.error(`\nCommand timed out after ${timeout / 1000} seconds.`);
252
+ proc.kill('SIGTERM');
253
+ // Force kill after 3 seconds
254
+ setTimeout(() => {
255
+ if (!proc.killed) {
256
+ proc.kill('SIGKILL');
257
+ }
258
+ }, 3000);
259
+ }
260
+ }, timeout);
261
+ proc.on('close', (code) => {
262
+ clearTimeout(timeoutId);
263
+ activeProcess = null;
264
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
265
+ if (code === 0) {
266
+ console.log(` [completed in ${elapsed}s]`);
267
+ }
268
+ resolve(code ?? 0);
269
+ });
270
+ proc.on('error', (err) => {
271
+ clearTimeout(timeoutId);
272
+ activeProcess = null;
273
+ console.error(`Failed to run command: ${err.message}`);
274
+ resolve(1);
275
+ });
276
+ });
277
+ }
278
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/commands/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ // TakoMusic CLI entry point
3
+ import { initCommand } from './commands/init.js';
4
+ import { fmtCommand } from './commands/fmt.js';
5
+ import { checkCommand } from './commands/check.js';
6
+ import { buildCommand } from './commands/build.js';
7
+ import { renderCommand } from './commands/render.js';
8
+ import { playCommand } from './commands/play.js';
9
+ import { doctorCommand } from './commands/doctor.js';
10
+ import { importCommand } from './commands/import.js';
11
+ import { recordCommand } from './commands/record.js';
12
+ import { ExitCodes } from '../errors.js';
13
+ const HELP = `
14
+ TakoMusic v1.2.0 - Music composition with MFS language
15
+
16
+ Usage: mf <command> [options]
17
+
18
+ Commands:
19
+ init Initialize a new TakoMusic project
20
+ fmt [path...] Format MFS source files
21
+ check [-p profile] Check source for errors
22
+ build [-p profile|all] Build IR and profile-specific outputs
23
+ render -p <profile|all> Render audio using external tools
24
+ play [file.mf] Live preview using FluidSynth
25
+ import <file> Import MusicXML/MIDI to MFS
26
+ record Record MIDI input from keyboard
27
+ doctor [-p profile] Check external dependencies
28
+
29
+ Options:
30
+ -p, --profile Target profile (miku, cli, all)
31
+ -h, --help Show this help message
32
+ -v, --version Show version
33
+
34
+ Examples:
35
+ mf init
36
+ mf fmt src/
37
+ mf check
38
+ mf build -p cli
39
+ mf play src/main.mf
40
+ mf render -p miku
41
+ `;
42
+ async function main() {
43
+ const args = process.argv.slice(2);
44
+ if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
45
+ console.log(HELP);
46
+ return ExitCodes.SUCCESS;
47
+ }
48
+ if (args[0] === '-v' || args[0] === '--version') {
49
+ console.log('TakoMusic v1.2.0');
50
+ return ExitCodes.SUCCESS;
51
+ }
52
+ const command = args[0];
53
+ const commandArgs = args.slice(1);
54
+ try {
55
+ switch (command) {
56
+ case 'init':
57
+ return await initCommand(commandArgs);
58
+ case 'fmt':
59
+ return await fmtCommand(commandArgs);
60
+ case 'check':
61
+ return await checkCommand(commandArgs);
62
+ case 'build':
63
+ return await buildCommand(commandArgs);
64
+ case 'render':
65
+ return await renderCommand(commandArgs);
66
+ case 'play':
67
+ return await playCommand(commandArgs);
68
+ case 'import':
69
+ return await importCommand(commandArgs);
70
+ case 'record':
71
+ return await recordCommand(commandArgs);
72
+ case 'doctor':
73
+ return await doctorCommand(commandArgs);
74
+ default:
75
+ console.error(`Unknown command: ${command}`);
76
+ console.log('Run "mf --help" for usage information.');
77
+ return ExitCodes.STATIC_ERROR;
78
+ }
79
+ }
80
+ catch (err) {
81
+ if (err instanceof Error) {
82
+ console.error(`Error: ${err.message}`);
83
+ }
84
+ else {
85
+ console.error('An unexpected error occurred');
86
+ }
87
+ return ExitCodes.STATIC_ERROR;
88
+ }
89
+ }
90
+ main().then((code) => {
91
+ process.exit(code);
92
+ });
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SongIR } from '../types/ir.js';
2
+ export declare class Compiler {
3
+ private modules;
4
+ private baseDir;
5
+ constructor(baseDir: string);
6
+ compile(entryPath: string): SongIR;
7
+ private loadModule;
8
+ private validateImportedModule;
9
+ private resolveAndRegister;
10
+ private evaluateConstExpr;
11
+ }
12
+ //# sourceMappingURL=compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAkBlC,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,iBAAiB;CAqB1B"}
@@ -0,0 +1,146 @@
1
+ // Compiler - orchestrates lexing, parsing, and interpretation with module resolution
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { Lexer } from '../lexer/index.js';
5
+ import { Parser } from '../parser/index.js';
6
+ import { Interpreter } from '../interpreter/index.js';
7
+ import { MFError, createError } from '../errors.js';
8
+ import { makeInt, makeFloat, makeString, makeBool, makePitch, makeDur, makeTime } from '../interpreter/runtime.js';
9
+ import { isStdlibImport, resolveStdlibPath } from '../utils/stdlib.js';
10
+ export class Compiler {
11
+ modules = new Map();
12
+ baseDir;
13
+ constructor(baseDir) {
14
+ this.baseDir = baseDir;
15
+ }
16
+ compile(entryPath) {
17
+ const absoluteEntryPath = path.isAbsolute(entryPath)
18
+ ? entryPath
19
+ : path.resolve(this.baseDir, entryPath);
20
+ // Load entry module and all its dependencies
21
+ const entryModule = this.loadModule(absoluteEntryPath);
22
+ // Create interpreter
23
+ const interpreter = new Interpreter(absoluteEntryPath);
24
+ // Resolve all imports and register procs/consts
25
+ this.resolveAndRegister(entryModule, interpreter, new Set());
26
+ // Execute
27
+ return interpreter.execute(entryModule.program);
28
+ }
29
+ loadModule(modulePath) {
30
+ const absolutePath = path.resolve(modulePath);
31
+ // Check cache
32
+ if (this.modules.has(absolutePath)) {
33
+ return this.modules.get(absolutePath);
34
+ }
35
+ // Read file
36
+ let source;
37
+ try {
38
+ source = fs.readFileSync(absolutePath, 'utf-8');
39
+ }
40
+ catch (err) {
41
+ throw new MFError('IO', `Cannot read file: ${absolutePath}`);
42
+ }
43
+ // Lex and parse
44
+ const lexer = new Lexer(source, absolutePath);
45
+ const tokens = lexer.tokenize();
46
+ const parser = new Parser(tokens, absolutePath);
47
+ const program = parser.parse();
48
+ // Extract exports
49
+ const exports = new Map();
50
+ for (const stmt of program.statements) {
51
+ if (stmt.kind === 'ExportStatement') {
52
+ exports.set(stmt.declaration.name, stmt.declaration);
53
+ }
54
+ else if (stmt.kind === 'ProcDeclaration' && stmt.exported) {
55
+ exports.set(stmt.name, stmt);
56
+ }
57
+ else if (stmt.kind === 'ConstDeclaration' && stmt.exported) {
58
+ exports.set(stmt.name, stmt);
59
+ }
60
+ }
61
+ const module = {
62
+ path: absolutePath,
63
+ program,
64
+ exports,
65
+ };
66
+ this.modules.set(absolutePath, module);
67
+ // Validate imported module (no top-level execution)
68
+ if (this.modules.size > 1) {
69
+ this.validateImportedModule(program, absolutePath);
70
+ }
71
+ return module;
72
+ }
73
+ validateImportedModule(program, filePath) {
74
+ for (const stmt of program.statements) {
75
+ if (stmt.kind === 'ExpressionStatement') {
76
+ const expr = stmt.expression;
77
+ if (expr.kind === 'CallExpression') {
78
+ const forbidden = ['track', 'note', 'rest', 'chord', 'drum', 'at', 'advance', 'title', 'ppq', 'tempo', 'timeSig'];
79
+ const calleeName = expr.callee.kind === 'Identifier' ? expr.callee.name : null;
80
+ if (calleeName && forbidden.includes(calleeName)) {
81
+ throw createError('E300', `Top-level execution in imported module: ${calleeName}()`, stmt.position, filePath);
82
+ }
83
+ }
84
+ }
85
+ else if (stmt.kind === 'TrackBlock') {
86
+ throw createError('E300', 'Top-level track block in imported module', stmt.position, filePath);
87
+ }
88
+ }
89
+ }
90
+ resolveAndRegister(module, interpreter, visited) {
91
+ if (visited.has(module.path)) {
92
+ return;
93
+ }
94
+ visited.add(module.path);
95
+ const moduleDir = path.dirname(module.path);
96
+ // Process imports first (depth-first)
97
+ for (const stmt of module.program.statements) {
98
+ if (stmt.kind === 'ImportStatement') {
99
+ // Resolve import path (handle std: imports)
100
+ const importPath = isStdlibImport(stmt.path)
101
+ ? resolveStdlibPath(stmt.path)
102
+ : path.resolve(moduleDir, stmt.path);
103
+ const importedModule = this.loadModule(importPath);
104
+ // Recursively resolve imports
105
+ this.resolveAndRegister(importedModule, interpreter, visited);
106
+ // Register imported symbols
107
+ for (const name of stmt.imports) {
108
+ const exported = importedModule.exports.get(name);
109
+ if (!exported) {
110
+ throw createError('E400', `'${name}' is not exported from '${stmt.path}'`, stmt.position, module.path);
111
+ }
112
+ if (exported.kind === 'ProcDeclaration') {
113
+ interpreter.registerProc(exported);
114
+ }
115
+ else {
116
+ // ConstDeclaration - evaluate and register
117
+ const value = this.evaluateConstExpr(exported.value, importedModule);
118
+ interpreter.registerConst(name, value);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ evaluateConstExpr(expr, module) {
125
+ // Simple constant expression evaluation for imports
126
+ switch (expr.kind) {
127
+ case 'IntLiteral':
128
+ return makeInt(expr.value);
129
+ case 'FloatLiteral':
130
+ return makeFloat(expr.value);
131
+ case 'StringLiteral':
132
+ return makeString(expr.value);
133
+ case 'BoolLiteral':
134
+ return makeBool(expr.value);
135
+ case 'PitchLiteral':
136
+ return makePitch(expr.midi);
137
+ case 'DurLiteral':
138
+ return makeDur(expr.numerator, expr.denominator);
139
+ case 'TimeLiteral':
140
+ return makeTime(expr.bar, expr.beat, expr.sub);
141
+ default:
142
+ throw new MFError('E400', `Cannot evaluate constant expression of kind: ${expr.kind}`, expr.position, module.path);
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { Compiler } from './compiler.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { Compiler } from './compiler.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,43 @@
1
+ export interface ProjectConfig {
2
+ entry: string;
3
+ dist: string;
4
+ out: string;
5
+ defaultProfile: string;
6
+ }
7
+ export interface MikuProfile {
8
+ backend: 'miku-daw';
9
+ importStrategy: 'manual';
10
+ dawExe?: string;
11
+ dawArgs?: string[];
12
+ dawProject?: string;
13
+ vsqxOut: string;
14
+ tempoMidOut: string;
15
+ renderOut: string;
16
+ }
17
+ export interface CliProfile {
18
+ backend: 'headless';
19
+ vocalCmd?: string[];
20
+ midiCmd?: string[];
21
+ mixCmd?: string[];
22
+ musicxmlOut: string;
23
+ bandMidOut: string;
24
+ renderOut: string;
25
+ }
26
+ export type Profile = MikuProfile | CliProfile;
27
+ export interface MFConfig {
28
+ project: ProjectConfig;
29
+ profiles: {
30
+ miku?: MikuProfile;
31
+ cli?: CliProfile;
32
+ };
33
+ }
34
+ export interface ConfigValidationResult {
35
+ valid: boolean;
36
+ errors: string[];
37
+ warnings: string[];
38
+ }
39
+ export declare function loadConfig(configPath: string): MFConfig;
40
+ export declare function validateConfig(configPath: string): ConfigValidationResult;
41
+ export declare function findConfigPath(startDir: string): string | null;
42
+ export declare function generateDefaultConfig(): string;
43
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,CAAC;IACpB,cAAc,EAAE,QAAQ,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE;QACR,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,GAAG,CAAC,EAAE,UAAU,CAAC;KAClB,CAAC;CACH;AA0BD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAcvD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAsFzE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe9D;AAsCD,wBAAgB,qBAAqB,IAAI,MAAM,CA0B9C"}