@marmooo/midy 0.0.8 → 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.
- package/esm/midy-GM1.d.ts +4 -43
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +39 -37
- package/esm/midy-GM2.d.ts +64 -113
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +301 -95
- package/esm/midy-GMLite.d.ts +4 -39
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +39 -37
- package/esm/midy.d.ts +64 -135
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +301 -99
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +4 -43
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +39 -37
- package/script/midy-GM2.d.ts +64 -113
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +301 -95
- package/script/midy-GMLite.d.ts +4 -39
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +39 -37
- package/script/midy.d.ts +64 -135
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +301 -99
package/script/midy-GMLite.js
CHANGED
|
@@ -186,23 +186,23 @@ class MidyGMLite {
|
|
|
186
186
|
this.totalTime = this.calcTotalTime();
|
|
187
187
|
}
|
|
188
188
|
setChannelAudioNodes(audioContext) {
|
|
189
|
-
const { gainLeft, gainRight } = this.panToGain(
|
|
189
|
+
const { gainLeft, gainRight } = this.panToGain(this.constructor.channelSettings.pan);
|
|
190
190
|
const gainL = new GainNode(audioContext, { gain: gainLeft });
|
|
191
191
|
const gainR = new GainNode(audioContext, { gain: gainRight });
|
|
192
192
|
const merger = new ChannelMergerNode(audioContext, { numberOfInputs: 2 });
|
|
193
193
|
gainL.connect(merger, 0, 0);
|
|
194
194
|
gainR.connect(merger, 0, 1);
|
|
195
|
-
merger.connect(this.masterGain);
|
|
196
195
|
return {
|
|
197
196
|
gainL,
|
|
198
197
|
gainR,
|
|
198
|
+
merger,
|
|
199
199
|
};
|
|
200
200
|
}
|
|
201
201
|
createChannels(audioContext) {
|
|
202
202
|
const channels = Array.from({ length: 16 }, () => {
|
|
203
203
|
return {
|
|
204
|
-
...
|
|
205
|
-
...
|
|
204
|
+
...this.constructor.channelSettings,
|
|
205
|
+
...this.constructor.effectSettings,
|
|
206
206
|
...this.setChannelAudioNodes(audioContext),
|
|
207
207
|
scheduledNotes: new Map(),
|
|
208
208
|
};
|
|
@@ -494,9 +494,9 @@ class MidyGMLite {
|
|
|
494
494
|
}
|
|
495
495
|
return noteList[0];
|
|
496
496
|
}
|
|
497
|
-
|
|
498
|
-
gainNode.connect(channel.
|
|
499
|
-
|
|
497
|
+
connectEffects(channel, gainNode) {
|
|
498
|
+
gainNode.connect(channel.merger);
|
|
499
|
+
merger.connect(this.masterGain);
|
|
500
500
|
}
|
|
501
501
|
cbToRatio(cb) {
|
|
502
502
|
return Math.pow(10, cb / 200);
|
|
@@ -562,7 +562,7 @@ class MidyGMLite {
|
|
|
562
562
|
startModulation(channel, note, time) {
|
|
563
563
|
const { instrumentKey } = note;
|
|
564
564
|
note.modLFOGain = new GainNode(this.audioContext, {
|
|
565
|
-
gain: this.cbToRatio(instrumentKey.modLfoToVolume
|
|
565
|
+
gain: this.cbToRatio(instrumentKey.modLfoToVolume + channel.modulation),
|
|
566
566
|
});
|
|
567
567
|
note.modLFO = new OscillatorNode(this.audioContext, {
|
|
568
568
|
frequency: this.centToHz(instrumentKey.freqModLFO),
|
|
@@ -601,7 +601,7 @@ class MidyGMLite {
|
|
|
601
601
|
if (!instrumentKey)
|
|
602
602
|
return;
|
|
603
603
|
const note = await this.createNote(channel, instrumentKey, noteNumber, velocity, startTime, isSF3);
|
|
604
|
-
this.
|
|
604
|
+
this.connectEffects(channel, note.gainNode);
|
|
605
605
|
const scheduledNotes = channel.scheduledNotes;
|
|
606
606
|
if (scheduledNotes.has(noteNumber)) {
|
|
607
607
|
scheduledNotes.get(noteNumber).push(note);
|
|
@@ -620,39 +620,41 @@ class MidyGMLite {
|
|
|
620
620
|
return;
|
|
621
621
|
if (!channel.scheduledNotes.has(noteNumber))
|
|
622
622
|
return;
|
|
623
|
-
const
|
|
624
|
-
for (let i = 0; i <
|
|
625
|
-
const
|
|
626
|
-
if (!
|
|
623
|
+
const scheduledNotes = channel.scheduledNotes.get(noteNumber);
|
|
624
|
+
for (let i = 0; i < scheduledNotes.length; i++) {
|
|
625
|
+
const note = scheduledNotes[i];
|
|
626
|
+
if (!note)
|
|
627
627
|
continue;
|
|
628
|
-
if (
|
|
628
|
+
if (note.ending)
|
|
629
629
|
continue;
|
|
630
|
-
const { bufferSource, filterNode, gainNode, modLFO, modLFOGain, instrumentKey, } = targetNote;
|
|
631
630
|
const velocityRate = (velocity + 127) / 127;
|
|
632
|
-
const volEndTime = stopTime +
|
|
633
|
-
|
|
634
|
-
gainNode.gain
|
|
631
|
+
const volEndTime = stopTime +
|
|
632
|
+
note.instrumentKey.volRelease * velocityRate;
|
|
633
|
+
note.gainNode.gain
|
|
634
|
+
.cancelScheduledValues(stopTime)
|
|
635
|
+
.linearRampToValueAtTime(0, volEndTime);
|
|
635
636
|
const maxFreq = this.audioContext.sampleRate / 2;
|
|
636
|
-
const baseFreq = this.centToHz(instrumentKey.initialFilterFc);
|
|
637
|
+
const baseFreq = this.centToHz(note.instrumentKey.initialFilterFc);
|
|
637
638
|
const adjustedBaseFreq = Math.min(maxFreq, baseFreq);
|
|
638
|
-
const modEndTime = stopTime +
|
|
639
|
-
|
|
639
|
+
const modEndTime = stopTime +
|
|
640
|
+
note.instrumentKey.modRelease * velocityRate;
|
|
641
|
+
note.filterNode.frequency
|
|
640
642
|
.cancelScheduledValues(stopTime)
|
|
641
643
|
.linearRampToValueAtTime(adjustedBaseFreq, modEndTime);
|
|
642
|
-
|
|
644
|
+
note.ending = true;
|
|
643
645
|
this.scheduleTask(() => {
|
|
644
|
-
bufferSource.loop = false;
|
|
646
|
+
note.bufferSource.loop = false;
|
|
645
647
|
}, stopTime);
|
|
646
648
|
return new Promise((resolve) => {
|
|
647
|
-
bufferSource.onended = () => {
|
|
648
|
-
|
|
649
|
-
bufferSource.disconnect(
|
|
650
|
-
filterNode.disconnect(
|
|
651
|
-
gainNode.disconnect(
|
|
652
|
-
if (modLFOGain)
|
|
653
|
-
modLFOGain.disconnect(
|
|
654
|
-
if (modLFO)
|
|
655
|
-
modLFO.stop();
|
|
649
|
+
note.bufferSource.onended = () => {
|
|
650
|
+
scheduledNotes[i] = null;
|
|
651
|
+
note.bufferSource.disconnect();
|
|
652
|
+
note.filterNode.disconnect();
|
|
653
|
+
note.gainNode.disconnect();
|
|
654
|
+
if (note.modLFOGain)
|
|
655
|
+
note.modLFOGain.disconnect();
|
|
656
|
+
if (note.modLFO)
|
|
657
|
+
note.modLFO.stop();
|
|
656
658
|
resolve();
|
|
657
659
|
};
|
|
658
660
|
bufferSource.stop(volEndTime);
|
|
@@ -894,11 +896,11 @@ class MidyGMLite {
|
|
|
894
896
|
case 2: // GM System Off
|
|
895
897
|
break;
|
|
896
898
|
default:
|
|
897
|
-
console.warn(`Unsupported Exclusive Message ${data}`);
|
|
899
|
+
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
898
900
|
}
|
|
899
901
|
break;
|
|
900
902
|
default:
|
|
901
|
-
console.warn(`Unsupported Exclusive Message ${data}`);
|
|
903
|
+
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
902
904
|
}
|
|
903
905
|
}
|
|
904
906
|
GM1SystemOn() {
|
|
@@ -917,11 +919,11 @@ class MidyGMLite {
|
|
|
917
919
|
case 1:
|
|
918
920
|
return this.handleMasterVolumeSysEx(data);
|
|
919
921
|
default:
|
|
920
|
-
console.warn(`Unsupported Exclusive Message ${data}`);
|
|
922
|
+
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
921
923
|
}
|
|
922
924
|
break;
|
|
923
925
|
default:
|
|
924
|
-
console.warn(`Unsupported Exclusive Message ${data}`);
|
|
926
|
+
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
925
927
|
}
|
|
926
928
|
}
|
|
927
929
|
handleMasterVolumeSysEx(data) {
|
|
@@ -939,7 +941,7 @@ class MidyGMLite {
|
|
|
939
941
|
}
|
|
940
942
|
}
|
|
941
943
|
handleExclusiveMessage(data) {
|
|
942
|
-
console.warn(`Unsupported Exclusive Message ${data}`);
|
|
944
|
+
console.warn(`Unsupported Exclusive Message: ${data}`);
|
|
943
945
|
}
|
|
944
946
|
handleSysEx(data) {
|
|
945
947
|
switch (data[0]) {
|
package/script/midy.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export class Midy {
|
|
|
4
4
|
volume: number;
|
|
5
5
|
pan: number;
|
|
6
6
|
portamentoTime: number;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
reverbSendLevel: number;
|
|
8
|
+
chorusSendLevel: number;
|
|
9
9
|
vibratoRate: number;
|
|
10
10
|
vibratoDepth: number;
|
|
11
11
|
vibratoDelay: number;
|
|
@@ -40,12 +40,26 @@ export class Midy {
|
|
|
40
40
|
lfoFilterDepth: number;
|
|
41
41
|
lfoAmplitudeDepth: number;
|
|
42
42
|
};
|
|
43
|
-
constructor(audioContext: any
|
|
43
|
+
constructor(audioContext: any, options?: {
|
|
44
|
+
reverbAlgorithm: (audioContext: any) => {
|
|
45
|
+
input: any;
|
|
46
|
+
output: any;
|
|
47
|
+
};
|
|
48
|
+
});
|
|
44
49
|
ticksPerBeat: number;
|
|
45
50
|
totalTime: number;
|
|
46
|
-
reverbFactor: number;
|
|
47
51
|
masterFineTuning: number;
|
|
48
52
|
masterCoarseTuning: number;
|
|
53
|
+
reverb: {
|
|
54
|
+
time: number;
|
|
55
|
+
feedback: number;
|
|
56
|
+
};
|
|
57
|
+
chorus: {
|
|
58
|
+
modRate: number;
|
|
59
|
+
modDepth: number;
|
|
60
|
+
feedback: number;
|
|
61
|
+
sendToReverb: number;
|
|
62
|
+
};
|
|
49
63
|
mono: boolean;
|
|
50
64
|
omni: boolean;
|
|
51
65
|
noteCheckInterval: number;
|
|
@@ -63,69 +77,21 @@ export class Midy {
|
|
|
63
77
|
timeline: any[];
|
|
64
78
|
instruments: any[];
|
|
65
79
|
notePromises: any[];
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
sostenutoNotes: Map<any, any>;
|
|
71
|
-
polyphonicKeyPressure: {
|
|
72
|
-
pitchControl: number;
|
|
73
|
-
filterCutoffControl: number;
|
|
74
|
-
amplitudeControl: number;
|
|
75
|
-
lfoPitchDepth: number;
|
|
76
|
-
lfoFilterDepth: number;
|
|
77
|
-
lfoAmplitudeDepth: number;
|
|
78
|
-
};
|
|
79
|
-
channelPressure: {
|
|
80
|
-
pitchControl: number;
|
|
81
|
-
filterCutoffControl: number;
|
|
82
|
-
amplitudeControl: number;
|
|
83
|
-
lfoPitchDepth: number;
|
|
84
|
-
lfoFilterDepth: number;
|
|
85
|
-
lfoAmplitudeDepth: number;
|
|
80
|
+
defaultOptions: {
|
|
81
|
+
reverbAlgorithm: (audioContext: any) => {
|
|
82
|
+
input: any;
|
|
83
|
+
output: any;
|
|
86
84
|
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
94
|
-
chorusEffect: {
|
|
95
|
-
lfo: any;
|
|
96
|
-
lfoGain: any;
|
|
97
|
-
delayNodes: any[];
|
|
98
|
-
chorusGains: any[];
|
|
85
|
+
};
|
|
86
|
+
audioContext: any;
|
|
87
|
+
options: {
|
|
88
|
+
reverbAlgorithm: (audioContext: any) => {
|
|
89
|
+
input: any;
|
|
90
|
+
output: any;
|
|
99
91
|
};
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
portamento: boolean;
|
|
104
|
-
sostenutoPedal: boolean;
|
|
105
|
-
softPedal: number;
|
|
106
|
-
rpnMSB: number;
|
|
107
|
-
rpnLSB: number;
|
|
108
|
-
pitchBendRange: number;
|
|
109
|
-
currentBufferSource: null;
|
|
110
|
-
volume: number;
|
|
111
|
-
pan: number;
|
|
112
|
-
portamentoTime: number;
|
|
113
|
-
reverb: number;
|
|
114
|
-
chorus: number;
|
|
115
|
-
vibratoRate: number;
|
|
116
|
-
vibratoDepth: number;
|
|
117
|
-
vibratoDelay: number;
|
|
118
|
-
bank: number;
|
|
119
|
-
bankMSB: number;
|
|
120
|
-
bankLSB: number;
|
|
121
|
-
dataMSB: number;
|
|
122
|
-
dataLSB: number;
|
|
123
|
-
program: number;
|
|
124
|
-
pitchBend: number;
|
|
125
|
-
fineTuning: number;
|
|
126
|
-
coarseTuning: number;
|
|
127
|
-
modulationDepthRange: number;
|
|
128
|
-
}[];
|
|
92
|
+
};
|
|
93
|
+
masterGain: any;
|
|
94
|
+
channels: any[];
|
|
129
95
|
initSoundFontTable(): any[];
|
|
130
96
|
addSoundFont(soundFont: any): void;
|
|
131
97
|
loadSoundFont(soundFontUrl: any): Promise<void>;
|
|
@@ -133,79 +99,20 @@ export class Midy {
|
|
|
133
99
|
setChannelAudioNodes(audioContext: any): {
|
|
134
100
|
gainL: any;
|
|
135
101
|
gainR: any;
|
|
102
|
+
merger: any;
|
|
136
103
|
reverbEffect: {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
wetGain: any;
|
|
104
|
+
input: any;
|
|
105
|
+
output: any;
|
|
140
106
|
};
|
|
141
107
|
chorusEffect: {
|
|
142
108
|
lfo: any;
|
|
143
109
|
lfoGain: any;
|
|
144
110
|
delayNodes: any[];
|
|
145
111
|
chorusGains: any[];
|
|
112
|
+
output: any;
|
|
146
113
|
};
|
|
147
114
|
};
|
|
148
|
-
createChannels(audioContext: any):
|
|
149
|
-
scheduledNotes: Map<any, any>;
|
|
150
|
-
sostenutoNotes: Map<any, any>;
|
|
151
|
-
polyphonicKeyPressure: {
|
|
152
|
-
pitchControl: number;
|
|
153
|
-
filterCutoffControl: number;
|
|
154
|
-
amplitudeControl: number;
|
|
155
|
-
lfoPitchDepth: number;
|
|
156
|
-
lfoFilterDepth: number;
|
|
157
|
-
lfoAmplitudeDepth: number;
|
|
158
|
-
};
|
|
159
|
-
channelPressure: {
|
|
160
|
-
pitchControl: number;
|
|
161
|
-
filterCutoffControl: number;
|
|
162
|
-
amplitudeControl: number;
|
|
163
|
-
lfoPitchDepth: number;
|
|
164
|
-
lfoFilterDepth: number;
|
|
165
|
-
lfoAmplitudeDepth: number;
|
|
166
|
-
};
|
|
167
|
-
gainL: any;
|
|
168
|
-
gainR: any;
|
|
169
|
-
reverbEffect: {
|
|
170
|
-
convolverNode: any;
|
|
171
|
-
dryGain: any;
|
|
172
|
-
wetGain: any;
|
|
173
|
-
};
|
|
174
|
-
chorusEffect: {
|
|
175
|
-
lfo: any;
|
|
176
|
-
lfoGain: any;
|
|
177
|
-
delayNodes: any[];
|
|
178
|
-
chorusGains: any[];
|
|
179
|
-
};
|
|
180
|
-
expression: number;
|
|
181
|
-
modulation: number;
|
|
182
|
-
sustainPedal: boolean;
|
|
183
|
-
portamento: boolean;
|
|
184
|
-
sostenutoPedal: boolean;
|
|
185
|
-
softPedal: number;
|
|
186
|
-
rpnMSB: number;
|
|
187
|
-
rpnLSB: number;
|
|
188
|
-
pitchBendRange: number;
|
|
189
|
-
currentBufferSource: null;
|
|
190
|
-
volume: number;
|
|
191
|
-
pan: number;
|
|
192
|
-
portamentoTime: number;
|
|
193
|
-
reverb: number;
|
|
194
|
-
chorus: number;
|
|
195
|
-
vibratoRate: number;
|
|
196
|
-
vibratoDepth: number;
|
|
197
|
-
vibratoDelay: number;
|
|
198
|
-
bank: number;
|
|
199
|
-
bankMSB: number;
|
|
200
|
-
bankLSB: number;
|
|
201
|
-
dataMSB: number;
|
|
202
|
-
dataLSB: number;
|
|
203
|
-
program: number;
|
|
204
|
-
pitchBend: number;
|
|
205
|
-
fineTuning: number;
|
|
206
|
-
coarseTuning: number;
|
|
207
|
-
modulationDepthRange: number;
|
|
208
|
-
}[];
|
|
115
|
+
createChannels(audioContext: any): any[];
|
|
209
116
|
createNoteBuffer(instrumentKey: any, isSF3: any): Promise<any>;
|
|
210
117
|
createNoteBufferNode(instrumentKey: any, isSF3: any): Promise<any>;
|
|
211
118
|
convertToFloat32Array(uint8Array: any): Float32Array;
|
|
@@ -228,18 +135,27 @@ export class Midy {
|
|
|
228
135
|
currentTime(): number;
|
|
229
136
|
getActiveNotes(channel: any, time: any): Map<any, any>;
|
|
230
137
|
getActiveNote(noteList: any, time: any): any;
|
|
231
|
-
|
|
138
|
+
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
139
|
+
createConvolutionReverb(audioContext: any, impulse: any): {
|
|
140
|
+
input: any;
|
|
141
|
+
output: any;
|
|
232
142
|
convolverNode: any;
|
|
233
|
-
|
|
234
|
-
|
|
143
|
+
};
|
|
144
|
+
createCombFilter(audioContext: any, input: any, delay: any, feedback: any): any;
|
|
145
|
+
createAllpassFilter(audioContext: any, input: any, delay: any, feedback: any): any;
|
|
146
|
+
generateDistributedArray(center: any, count: any, varianceRatio?: number, randomness?: number): any[];
|
|
147
|
+
createSchroederReverb(audioContext: any, combDelays: any, combFeedbacks: any, allpassDelays: any, allpassFeedbacks: any): {
|
|
148
|
+
input: any;
|
|
149
|
+
output: any;
|
|
235
150
|
};
|
|
236
151
|
createChorusEffect(audioContext: any, options?: {}): {
|
|
237
152
|
lfo: any;
|
|
238
153
|
lfoGain: any;
|
|
239
154
|
delayNodes: any[];
|
|
240
155
|
chorusGains: any[];
|
|
156
|
+
output: any;
|
|
241
157
|
};
|
|
242
|
-
|
|
158
|
+
connectEffects(channel: any, gainNode: any): void;
|
|
243
159
|
cbToRatio(cb: any): number;
|
|
244
160
|
centToHz(cent: any): number;
|
|
245
161
|
calcSemitoneOffset(channel: any): any;
|
|
@@ -279,8 +195,8 @@ export class Midy {
|
|
|
279
195
|
updateChannelGain(channel: any): void;
|
|
280
196
|
setSustainPedal(channelNumber: any, value: any): void;
|
|
281
197
|
setPortamento(channelNumber: any, value: any): void;
|
|
282
|
-
setReverbSendLevel(channelNumber: any,
|
|
283
|
-
setChorusSendLevel(channelNumber: any,
|
|
198
|
+
setReverbSendLevel(channelNumber: any, reverbSendLevel: any): void;
|
|
199
|
+
setChorusSendLevel(channelNumber: any, chorusSendLevel: any): void;
|
|
284
200
|
setSostenutoPedal(channelNumber: any, value: any): void;
|
|
285
201
|
setSoftPedal(channelNumber: any, softPedal: any): void;
|
|
286
202
|
setVibratoRate(channelNumber: any, vibratoRate: any): void;
|
|
@@ -320,6 +236,19 @@ export class Midy {
|
|
|
320
236
|
setMasterFineTuning(fineTuning: any): void;
|
|
321
237
|
handleMasterCoarseTuningSysEx(data: any): void;
|
|
322
238
|
setMasterCoarseTuning(coarseTuning: any): void;
|
|
239
|
+
handleGlobalParameterControl(data: any): void;
|
|
240
|
+
handleReverbParameter(data: any): void;
|
|
241
|
+
setReverbType(type: any): void;
|
|
242
|
+
getReverbTimeFromType(type: any): number | undefined;
|
|
243
|
+
setReverbTime(value: any): void;
|
|
244
|
+
getReverbTime(value: any): number;
|
|
245
|
+
calcDelay(rt60: any, feedback: any): number;
|
|
246
|
+
handleChorusParameter(data: any): void;
|
|
247
|
+
setChorusType(type: any): void;
|
|
248
|
+
setChorusModRate(value: any): void;
|
|
249
|
+
setChorusModDepth(value: any): void;
|
|
250
|
+
setChorusFeedback(value: any): void;
|
|
251
|
+
setChorusSendToReverb(value: any): void;
|
|
323
252
|
handleExclusiveMessage(data: any): void;
|
|
324
253
|
handleSysEx(data: any): void;
|
|
325
254
|
scheduleTask(callback: any, startTime: any): Promise<any>;
|
package/script/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAuBA;
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"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"}
|