swf-toolkit 0.0.0-stage → 0.1.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -2
  3. package/README.tr.md +126 -0
  4. package/dist/abc/abc-file.d.ts +168 -0
  5. package/dist/abc/abc-file.js +656 -0
  6. package/dist/abc/analysis.d.ts +36 -0
  7. package/dist/abc/analysis.js +213 -0
  8. package/dist/abc/code.d.ts +59 -0
  9. package/dist/abc/code.js +379 -0
  10. package/dist/abc/constants.d.ts +80 -0
  11. package/dist/abc/constants.js +93 -0
  12. package/dist/abc/interner.d.ts +46 -0
  13. package/dist/abc/interner.js +168 -0
  14. package/dist/abc/model.d.ts +40 -0
  15. package/dist/abc/model.js +146 -0
  16. package/dist/abc/opcodes.d.ts +39 -0
  17. package/dist/abc/opcodes.js +196 -0
  18. package/dist/abc/pcode/assembler.d.ts +42 -0
  19. package/dist/abc/pcode/assembler.js +635 -0
  20. package/dist/abc/pcode/disassembler.d.ts +17 -0
  21. package/dist/abc/pcode/disassembler.js +147 -0
  22. package/dist/abc/pcode/format.d.ts +23 -0
  23. package/dist/abc/pcode/format.js +131 -0
  24. package/dist/abc/pcode/lexer.d.ts +34 -0
  25. package/dist/abc/pcode/lexer.js +183 -0
  26. package/dist/assets/assets.d.ts +26 -0
  27. package/dist/assets/assets.js +151 -0
  28. package/dist/assets/images.d.ts +31 -0
  29. package/dist/assets/images.js +238 -0
  30. package/dist/assets/png.d.ts +12 -0
  31. package/dist/assets/png.js +196 -0
  32. package/dist/assets/sounds.d.ts +37 -0
  33. package/dist/assets/sounds.js +236 -0
  34. package/dist/avm1/avm1.d.ts +55 -0
  35. package/dist/avm1/avm1.js +642 -0
  36. package/dist/avm1/project.d.ts +16 -0
  37. package/dist/avm1/project.js +81 -0
  38. package/dist/cjs/abc/abc-file.d.ts +168 -0
  39. package/dist/cjs/abc/abc-file.js +663 -0
  40. package/dist/cjs/abc/analysis.d.ts +36 -0
  41. package/dist/cjs/abc/analysis.js +221 -0
  42. package/dist/cjs/abc/code.d.ts +59 -0
  43. package/dist/cjs/abc/code.js +387 -0
  44. package/dist/cjs/abc/constants.d.ts +80 -0
  45. package/dist/cjs/abc/constants.js +97 -0
  46. package/dist/cjs/abc/interner.d.ts +46 -0
  47. package/dist/cjs/abc/interner.js +172 -0
  48. package/dist/cjs/abc/model.d.ts +40 -0
  49. package/dist/cjs/abc/model.js +155 -0
  50. package/dist/cjs/abc/opcodes.d.ts +39 -0
  51. package/dist/cjs/abc/opcodes.js +201 -0
  52. package/dist/cjs/abc/pcode/assembler.d.ts +42 -0
  53. package/dist/cjs/abc/pcode/assembler.js +640 -0
  54. package/dist/cjs/abc/pcode/disassembler.d.ts +17 -0
  55. package/dist/cjs/abc/pcode/disassembler.js +152 -0
  56. package/dist/cjs/abc/pcode/format.d.ts +23 -0
  57. package/dist/cjs/abc/pcode/format.js +141 -0
  58. package/dist/cjs/abc/pcode/lexer.d.ts +34 -0
  59. package/dist/cjs/abc/pcode/lexer.js +188 -0
  60. package/dist/cjs/assets/assets.d.ts +26 -0
  61. package/dist/cjs/assets/assets.js +159 -0
  62. package/dist/cjs/assets/images.d.ts +31 -0
  63. package/dist/cjs/assets/images.js +246 -0
  64. package/dist/cjs/assets/png.d.ts +12 -0
  65. package/dist/cjs/assets/png.js +202 -0
  66. package/dist/cjs/assets/sounds.d.ts +37 -0
  67. package/dist/cjs/assets/sounds.js +246 -0
  68. package/dist/cjs/avm1/avm1.d.ts +55 -0
  69. package/dist/cjs/avm1/avm1.js +649 -0
  70. package/dist/cjs/avm1/project.d.ts +16 -0
  71. package/dist/cjs/avm1/project.js +88 -0
  72. package/dist/cjs/compiler/ast.d.ts +285 -0
  73. package/dist/cjs/compiler/ast.js +3 -0
  74. package/dist/cjs/compiler/class-compiler.d.ts +34 -0
  75. package/dist/cjs/compiler/class-compiler.js +440 -0
  76. package/dist/cjs/compiler/codegen.d.ts +144 -0
  77. package/dist/cjs/compiler/codegen.js +1589 -0
  78. package/dist/cjs/compiler/lexer.d.ts +27 -0
  79. package/dist/cjs/compiler/lexer.js +254 -0
  80. package/dist/cjs/compiler/parser.d.ts +58 -0
  81. package/dist/cjs/compiler/parser.js +989 -0
  82. package/dist/cjs/compiler/program.d.ts +29 -0
  83. package/dist/cjs/compiler/program.js +36 -0
  84. package/dist/cjs/compiler/scope.d.ts +22 -0
  85. package/dist/cjs/compiler/scope.js +242 -0
  86. package/dist/cjs/compression/lzma.d.ts +37 -0
  87. package/dist/cjs/compression/lzma.js +575 -0
  88. package/dist/cjs/compression/swf-container.d.ts +19 -0
  89. package/dist/cjs/compression/swf-container.js +92 -0
  90. package/dist/cjs/decompiler/ast.d.ts +228 -0
  91. package/dist/cjs/decompiler/ast.js +455 -0
  92. package/dist/cjs/decompiler/cfg.d.ts +40 -0
  93. package/dist/cjs/decompiler/cfg.js +236 -0
  94. package/dist/cjs/decompiler/class-printer.d.ts +9 -0
  95. package/dist/cjs/decompiler/class-printer.js +173 -0
  96. package/dist/cjs/decompiler/method.d.ts +41 -0
  97. package/dist/cjs/decompiler/method.js +436 -0
  98. package/dist/cjs/decompiler/simulate.d.ts +55 -0
  99. package/dist/cjs/decompiler/simulate.js +591 -0
  100. package/dist/cjs/decompiler/structure.d.ts +48 -0
  101. package/dist/cjs/decompiler/structure.js +764 -0
  102. package/dist/cjs/errors.d.ts +11 -0
  103. package/dist/cjs/errors.js +25 -0
  104. package/dist/cjs/index.d.ts +41 -0
  105. package/dist/cjs/index.js +82 -0
  106. package/dist/cjs/io/reader.d.ts +48 -0
  107. package/dist/cjs/io/reader.js +180 -0
  108. package/dist/cjs/io/writer.d.ts +37 -0
  109. package/dist/cjs/io/writer.js +175 -0
  110. package/dist/cjs/package.json +1 -0
  111. package/dist/cjs/project/pcode-project.d.ts +32 -0
  112. package/dist/cjs/project/pcode-project.js +210 -0
  113. package/dist/cjs/project/source-export.d.ts +12 -0
  114. package/dist/cjs/project/source-export.js +51 -0
  115. package/dist/cjs/project/source-import.d.ts +13 -0
  116. package/dist/cjs/project/source-import.js +73 -0
  117. package/dist/cjs/swf/swf.d.ts +63 -0
  118. package/dist/cjs/swf/swf.js +147 -0
  119. package/dist/cjs/swf/tag-codes.d.ts +77 -0
  120. package/dist/cjs/swf/tag-codes.js +109 -0
  121. package/dist/cjs/swf/tags.d.ts +118 -0
  122. package/dist/cjs/swf/tags.js +330 -0
  123. package/dist/cli.d.ts +2 -0
  124. package/dist/cli.js +296 -0
  125. package/dist/compiler/ast.d.ts +285 -0
  126. package/dist/compiler/ast.js +2 -0
  127. package/dist/compiler/class-compiler.d.ts +34 -0
  128. package/dist/compiler/class-compiler.js +437 -0
  129. package/dist/compiler/codegen.d.ts +144 -0
  130. package/dist/compiler/codegen.js +1585 -0
  131. package/dist/compiler/lexer.d.ts +27 -0
  132. package/dist/compiler/lexer.js +249 -0
  133. package/dist/compiler/parser.d.ts +58 -0
  134. package/dist/compiler/parser.js +984 -0
  135. package/dist/compiler/program.d.ts +29 -0
  136. package/dist/compiler/program.js +32 -0
  137. package/dist/compiler/scope.d.ts +22 -0
  138. package/dist/compiler/scope.js +238 -0
  139. package/dist/compression/lzma.d.ts +37 -0
  140. package/dist/compression/lzma.js +569 -0
  141. package/dist/compression/swf-container.d.ts +19 -0
  142. package/dist/compression/swf-container.js +87 -0
  143. package/dist/decompiler/ast.d.ts +228 -0
  144. package/dist/decompiler/ast.js +441 -0
  145. package/dist/decompiler/cfg.d.ts +40 -0
  146. package/dist/decompiler/cfg.js +231 -0
  147. package/dist/decompiler/class-printer.d.ts +9 -0
  148. package/dist/decompiler/class-printer.js +170 -0
  149. package/dist/decompiler/method.d.ts +41 -0
  150. package/dist/decompiler/method.js +427 -0
  151. package/dist/decompiler/simulate.d.ts +55 -0
  152. package/dist/decompiler/simulate.js +586 -0
  153. package/dist/decompiler/structure.d.ts +48 -0
  154. package/dist/decompiler/structure.js +760 -0
  155. package/dist/errors.d.ts +11 -0
  156. package/dist/errors.js +20 -0
  157. package/dist/index.d.ts +41 -0
  158. package/dist/index.js +49 -0
  159. package/dist/io/reader.d.ts +48 -0
  160. package/dist/io/reader.js +176 -0
  161. package/dist/io/writer.d.ts +37 -0
  162. package/dist/io/writer.js +169 -0
  163. package/dist/project/pcode-project.d.ts +32 -0
  164. package/dist/project/pcode-project.js +203 -0
  165. package/dist/project/source-export.d.ts +12 -0
  166. package/dist/project/source-export.js +47 -0
  167. package/dist/project/source-import.d.ts +13 -0
  168. package/dist/project/source-import.js +70 -0
  169. package/dist/swf/swf.d.ts +63 -0
  170. package/dist/swf/swf.js +143 -0
  171. package/dist/swf/tag-codes.d.ts +77 -0
  172. package/dist/swf/tag-codes.js +105 -0
  173. package/dist/swf/tags.d.ts +118 -0
  174. package/dist/swf/tags.js +316 -0
  175. package/package.json +71 -4
@@ -0,0 +1,236 @@
1
+ /**
2
+ * DefineSound ↔ audio files: MP3 passthrough, uncompressed PCM / ADPCM → WAV,
3
+ * MP3 / WAV import.
4
+ */
5
+ import { ByteReader } from '../io/reader.js';
6
+ import { ByteWriter } from '../io/writer.js';
7
+ import { TagCode } from '../swf/tag-codes.js';
8
+ import { RawTag } from '../swf/tags.js';
9
+ export const SOUND_RATES = [5512, 11025, 22050, 44100];
10
+ export function parseDefineSound(tag) {
11
+ const r = new ByteReader(tag.data);
12
+ const id = r.u16();
13
+ const flags = r.u8();
14
+ return {
15
+ id,
16
+ format: flags >> 4,
17
+ rate: SOUND_RATES[(flags >> 2) & 3],
18
+ bits: flags & 2 ? 16 : 8,
19
+ channels: flags & 1 ? 2 : 1,
20
+ sampleCount: r.u32(),
21
+ data: r.rest(),
22
+ };
23
+ }
24
+ export function encodeWav(pcm, rate, channels, bits) {
25
+ const w = new ByteWriter(pcm.length + 44);
26
+ const str = (s) => {
27
+ for (const c of s)
28
+ w.u8(c.charCodeAt(0));
29
+ };
30
+ str('RIFF');
31
+ w.u32(36 + pcm.length);
32
+ str('WAVE');
33
+ str('fmt ');
34
+ w.u32(16).u16(1).u16(channels).u32(rate).u32((rate * channels * bits) / 8).u16((channels * bits) / 8).u16(bits);
35
+ str('data');
36
+ w.u32(pcm.length);
37
+ w.bytes(pcm);
38
+ return w.toBytes();
39
+ }
40
+ const STEP_TABLE = [
41
+ 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190,
42
+ 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499,
43
+ 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385,
44
+ 24623, 27086, 29794, 32767,
45
+ ];
46
+ const INDEX_TABLES = [
47
+ [-1, 2],
48
+ [-1, -1, 2, 4],
49
+ [-1, -1, -1, -1, 2, 4, 6, 8],
50
+ [-1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16],
51
+ ];
52
+ /** Decodes SWF ADPCM to 16-bit little-endian PCM. */
53
+ export function decodeAdpcm(data, channels, sampleCount) {
54
+ const r = new ByteReader(data);
55
+ const bitsTotal = data.length * 8;
56
+ let bitsRead = 0;
57
+ const ub = (n) => {
58
+ bitsRead += n;
59
+ return r.ub(n);
60
+ };
61
+ const sb = (n) => {
62
+ bitsRead += n;
63
+ return r.sb(n);
64
+ };
65
+ const nb = ub(2) + 2;
66
+ const table = INDEX_TABLES[nb - 2];
67
+ const signMask = 1 << (nb - 1);
68
+ const out = new Int16Array(sampleCount * channels);
69
+ let o = 0;
70
+ const pred = [0, 0];
71
+ const index = [0, 0];
72
+ outer: while (o < out.length) {
73
+ if (bitsRead + channels * 22 > bitsTotal)
74
+ break;
75
+ for (let c = 0; c < channels; c++) {
76
+ pred[c] = sb(16);
77
+ index[c] = ub(6);
78
+ out[o++] = pred[c];
79
+ }
80
+ for (let i = 0; i < 4095 && o < out.length; i++) {
81
+ for (let c = 0; c < channels; c++) {
82
+ if (bitsRead + nb > bitsTotal)
83
+ break outer;
84
+ const code = ub(nb);
85
+ let step = STEP_TABLE[index[c]];
86
+ let diff = step >> (nb - 1);
87
+ for (let k = signMask >> 1; k; k >>= 1) {
88
+ if (code & k)
89
+ diff += step;
90
+ step >>= 1;
91
+ }
92
+ let p = pred[c] + (code & signMask ? -diff : diff);
93
+ p = Math.max(-32768, Math.min(32767, p));
94
+ pred[c] = p;
95
+ index[c] = Math.max(0, Math.min(88, index[c] + table[code & ~signMask]));
96
+ out[o++] = p;
97
+ }
98
+ }
99
+ }
100
+ return new Uint8Array(out.buffer, 0, o * 2);
101
+ }
102
+ export function extractSound(tag) {
103
+ if (!(tag instanceof RawTag) || tag.code !== TagCode.DefineSound)
104
+ return undefined;
105
+ const s = parseDefineSound(tag);
106
+ const { data, ...info } = s;
107
+ switch (s.format) {
108
+ case 2:
109
+ return { id: s.id, ext: 'mp3', data: data.subarray(2).slice(), info };
110
+ case 0:
111
+ case 3:
112
+ return { id: s.id, ext: 'wav', data: encodeWav(data, s.rate, s.channels, s.bits), info };
113
+ case 1:
114
+ return { id: s.id, ext: 'wav', data: encodeWav(decodeAdpcm(data, s.channels, s.sampleCount), s.rate, s.channels, 16), info };
115
+ case 11:
116
+ return { id: s.id, ext: 'speex', data: data.slice(), info };
117
+ default:
118
+ return { id: s.id, ext: 'nelly', data: data.slice(), info };
119
+ }
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // Import
123
+ // ---------------------------------------------------------------------------
124
+ const MP3_BITRATES = {
125
+ v1: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320],
126
+ v2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
127
+ };
128
+ const MP3_RATES = { 3: [44100, 48000, 32000], 2: [22050, 24000, 16000], 0: [11025, 12000, 8000] };
129
+ export function parseMp3(b) {
130
+ let i = 0;
131
+ if (b[0] === 0x49 && b[1] === 0x44 && b[2] === 0x33) {
132
+ const size = ((b[6] & 0x7f) << 21) | ((b[7] & 0x7f) << 14) | ((b[8] & 0x7f) << 7) | (b[9] & 0x7f);
133
+ i = 10 + size;
134
+ }
135
+ let start = -1;
136
+ let rate = 0;
137
+ let channels = 2;
138
+ let samples = 0;
139
+ let end = i;
140
+ while (i + 4 <= b.length) {
141
+ if (b[i] !== 0xff || (b[i + 1] & 0xe0) !== 0xe0) {
142
+ if (start >= 0)
143
+ break;
144
+ i++;
145
+ continue;
146
+ }
147
+ const version = (b[i + 1] >> 3) & 3; // 3 = MPEG1, 2 = MPEG2, 0 = MPEG2.5
148
+ const layer = (b[i + 1] >> 1) & 3; // 1 = layer III
149
+ const brIdx = b[i + 2] >> 4;
150
+ const srIdx = (b[i + 2] >> 2) & 3;
151
+ const pad = (b[i + 2] >> 1) & 1;
152
+ if (version === 1 || layer !== 1 || brIdx === 0 || brIdx === 15 || srIdx === 3) {
153
+ if (start >= 0)
154
+ break;
155
+ i++;
156
+ continue;
157
+ }
158
+ const sr = MP3_RATES[version][srIdx];
159
+ const br = (version === 3 ? MP3_BITRATES.v1 : MP3_BITRATES.v2)[brIdx] * 1000;
160
+ const len = Math.floor(((version === 3 ? 144 : 72) * br) / sr) + pad;
161
+ if (start < 0) {
162
+ start = i;
163
+ rate = sr;
164
+ channels = (b[i + 3] >> 6) === 3 ? 1 : 2;
165
+ }
166
+ samples += version === 3 ? 1152 : 576;
167
+ i += len;
168
+ end = Math.min(i, b.length);
169
+ }
170
+ if (start < 0)
171
+ throw new Error('No MP3 frames found');
172
+ return { rate, channels, sampleCount: samples, start, end };
173
+ }
174
+ function rateCode(rate) {
175
+ const i = SOUND_RATES.indexOf(rate === 5513 ? 5512 : rate);
176
+ if (i < 0)
177
+ throw new Error(`Sample rate ${rate} Hz is not supported by SWF (use 5512, 11025, 22050 or 44100)`);
178
+ return i;
179
+ }
180
+ /** Builds a DefineSound body from an MP3 or WAV file. */
181
+ export function encodeDefineSound(id, file) {
182
+ const w = new ByteWriter(file.length + 16);
183
+ const isWav = file[0] === 0x52 && file[1] === 0x49 && file[2] === 0x46 && file[3] === 0x46;
184
+ if (isWav) {
185
+ const r = new ByteReader(file, 12);
186
+ let fmt;
187
+ let pcm;
188
+ while (r.remaining >= 8) {
189
+ const ck = String.fromCharCode(...r.bytesView(4));
190
+ const len = r.u32();
191
+ const body = r.bytesView(Math.min(len, r.remaining));
192
+ if (ck === 'fmt ') {
193
+ const f = new ByteReader(body);
194
+ if (f.u16() !== 1)
195
+ throw new Error('Only PCM WAV files are supported');
196
+ fmt = { channels: f.u16(), rate: f.u32(), bits: (f.u32(), f.u16(), f.u16()) };
197
+ }
198
+ else if (ck === 'data')
199
+ pcm = body;
200
+ if (len & 1 && r.remaining)
201
+ r.u8();
202
+ }
203
+ if (!fmt || !pcm)
204
+ throw new Error('Invalid WAV file');
205
+ if (fmt.bits !== 8 && fmt.bits !== 16)
206
+ throw new Error('WAV must be 8 or 16 bit');
207
+ if (fmt.channels !== 1 && fmt.channels !== 2)
208
+ throw new Error('WAV must be mono or stereo');
209
+ w.u16(id);
210
+ w.u8((3 << 4) | (rateCode(fmt.rate) << 2) | (fmt.bits === 16 ? 2 : 0) | (fmt.channels === 2 ? 1 : 0));
211
+ w.u32(pcm.length / ((fmt.bits / 8) * fmt.channels));
212
+ w.bytes(pcm);
213
+ return w.toBytes();
214
+ }
215
+ const mp3 = parseMp3(file);
216
+ w.u16(id);
217
+ w.u8((2 << 4) | (rateCode(mp3.rate) << 2) | 2 | (mp3.channels === 2 ? 1 : 0));
218
+ w.u32(mp3.sampleCount);
219
+ w.s16(0); // seek samples
220
+ w.bytes(file.subarray(mp3.start, mp3.end));
221
+ return w.toBytes();
222
+ }
223
+ /** Replaces DefineSound `id` with an MP3 or WAV file. */
224
+ export function replaceSound(swf, id, file) {
225
+ for (const { tag, parent, index } of swf.walkTags()) {
226
+ if (tag.characterId !== id)
227
+ continue;
228
+ if (tag.code !== TagCode.DefineSound)
229
+ throw new Error(`Character ${id} is a ${tag.name}, not a sound`);
230
+ const next = new RawTag(TagCode.DefineSound, encodeDefineSound(id, file));
231
+ next.longHeader = true;
232
+ (parent ? parent.tags : swf.tags)[index] = next;
233
+ return next;
234
+ }
235
+ throw new Error(`No character with id ${id}`);
236
+ }
@@ -0,0 +1,55 @@
1
+ export type Avm1Value = {
2
+ t: 'string';
3
+ v: string;
4
+ } | {
5
+ t: 'float';
6
+ v: number;
7
+ } | {
8
+ t: 'null';
9
+ } | {
10
+ t: 'undefined';
11
+ } | {
12
+ t: 'register';
13
+ v: number;
14
+ } | {
15
+ t: 'boolean';
16
+ v: boolean;
17
+ } | {
18
+ t: 'double';
19
+ v: number;
20
+ } | {
21
+ t: 'integer';
22
+ v: number;
23
+ } | {
24
+ t: 'constant8';
25
+ v: number;
26
+ } | {
27
+ t: 'constant16';
28
+ v: number;
29
+ };
30
+ export interface Avm1Action {
31
+ type: 'action';
32
+ code: number;
33
+ /** Operands; label ids are numbers in `labels`. */
34
+ args: unknown[];
35
+ /** Label operands (jump target / block ends), in action-specific order. */
36
+ labels: number[];
37
+ /** Unknown action payload (kept verbatim). */
38
+ raw?: Uint8Array;
39
+ }
40
+ export interface Avm1Label {
41
+ type: 'label';
42
+ id: number;
43
+ }
44
+ export type Avm1Item = Avm1Action | Avm1Label;
45
+ export declare function actionName(code: number): string;
46
+ /** Decodes AVM1 action bytes. Branches and block sizes become labels. */
47
+ export declare function decodeActions(bytes: Uint8Array): Avm1Item[];
48
+ /** Encodes an action list back to bytes. Sizes are fixed-point iterated (branches never change length). */
49
+ export declare function encodeActions(items: readonly Avm1Item[]): Uint8Array;
50
+ /** Formats actions as editable AS1/AS2 P-code. */
51
+ export declare function formatActions(items: readonly Avm1Item[], options?: {
52
+ constantPool?: string[];
53
+ }): string;
54
+ /** Parses P-code produced by {@link formatActions}. */
55
+ export declare function parseActions(text: string): Avm1Item[];