@marmooo/midy 0.5.0 → 0.5.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.
- package/README.md +17 -2
- package/esm/midy-GM1.d.ts +3 -2
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +59 -67
- package/esm/midy-GM2.d.ts +8 -18
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +117 -158
- package/esm/midy-GMLite.d.ts +3 -2
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +60 -68
- package/esm/midy.d.ts +8 -18
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +121 -161
- package/esm/reverb.d.ts +58 -0
- package/esm/reverb.d.ts.map +1 -0
- package/esm/reverb.js +389 -0
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +3 -2
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +59 -67
- package/script/midy-GM2.d.ts +8 -18
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +117 -158
- package/script/midy-GMLite.d.ts +3 -2
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +60 -68
- package/script/midy.d.ts +8 -18
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +121 -161
- package/script/reverb.d.ts +58 -0
- package/script/reverb.d.ts.map +1 -0
- package/script/reverb.js +405 -0
package/script/midy-GM1.js
CHANGED
|
@@ -163,7 +163,13 @@ class Note {
|
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
class Channel {
|
|
166
|
-
constructor(audioNodes, settings) {
|
|
166
|
+
constructor(channelNumber, audioNodes, settings) {
|
|
167
|
+
Object.defineProperty(this, "channelNumber", {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
configurable: true,
|
|
170
|
+
writable: true,
|
|
171
|
+
value: 0
|
|
172
|
+
});
|
|
167
173
|
Object.defineProperty(this, "isDrum", {
|
|
168
174
|
enumerable: true,
|
|
169
175
|
configurable: true,
|
|
@@ -248,6 +254,7 @@ class Channel {
|
|
|
248
254
|
writable: true,
|
|
249
255
|
value: null
|
|
250
256
|
});
|
|
257
|
+
this.channelNumber = channelNumber;
|
|
251
258
|
Object.assign(this, audioNodes);
|
|
252
259
|
Object.assign(this, settings);
|
|
253
260
|
this.state = new ControllerState();
|
|
@@ -877,6 +884,8 @@ class MidyGM1 extends EventTarget {
|
|
|
877
884
|
return;
|
|
878
885
|
const soundFont = this.soundFonts[soundFontIndex];
|
|
879
886
|
const voice = soundFont.getVoice(bank, programNumber, noteNumber, velocity);
|
|
887
|
+
if (!voice)
|
|
888
|
+
return;
|
|
880
889
|
const { instrument, sampleID } = voice.generators;
|
|
881
890
|
return soundFontIndex * (2 ** 31) + instrument * (2 ** 24) +
|
|
882
891
|
(sampleID << 8);
|
|
@@ -893,7 +902,7 @@ class MidyGM1 extends EventTarget {
|
|
|
893
902
|
}
|
|
894
903
|
createChannels(audioContext) {
|
|
895
904
|
const settings = this.constructor.channelSettings;
|
|
896
|
-
return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
|
|
905
|
+
return Array.from({ length: this.numChannels }, (_, ch) => new Channel(ch, this.createChannelAudioNodes(audioContext), settings));
|
|
897
906
|
}
|
|
898
907
|
decodeOggVorbis(sample) {
|
|
899
908
|
const task = decoderQueue.then(async () => {
|
|
@@ -1359,6 +1368,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1359
1368
|
continue;
|
|
1360
1369
|
const soundFont = this.soundFonts[soundFontIndex];
|
|
1361
1370
|
const fakeChannel = {
|
|
1371
|
+
channelNumber: ch,
|
|
1362
1372
|
state: { array: renderControllerStates[ch].slice() },
|
|
1363
1373
|
programNumber,
|
|
1364
1374
|
isDrum,
|
|
@@ -1677,25 +1687,29 @@ class MidyGM1 extends EventTarget {
|
|
|
1677
1687
|
const volHold = volAttack + voiceParams.volHold;
|
|
1678
1688
|
const decayDuration = voiceParams.volDecay;
|
|
1679
1689
|
const adsDuration = volHold + decayDuration * decayCurve * 5;
|
|
1680
|
-
const
|
|
1681
|
-
const
|
|
1690
|
+
const sampleLoopStart = voiceParams.loopStart / voiceParams.sampleRate;
|
|
1691
|
+
const sampleLoopDuration = isLoop
|
|
1682
1692
|
? (voiceParams.loopEnd - voiceParams.loopStart) / voiceParams.sampleRate
|
|
1683
1693
|
: 0;
|
|
1684
|
-
const
|
|
1685
|
-
|
|
1694
|
+
const playbackRate = voiceParams.playbackRate;
|
|
1695
|
+
const outputLoopStart = sampleLoopStart / playbackRate;
|
|
1696
|
+
const outputLoopDuration = sampleLoopDuration / playbackRate;
|
|
1697
|
+
const loopCount = isLoop && adsDuration > outputLoopStart
|
|
1698
|
+
? Math.ceil((adsDuration - outputLoopStart) / outputLoopDuration)
|
|
1686
1699
|
: 0;
|
|
1687
|
-
const alignedLoopStart =
|
|
1700
|
+
const alignedLoopStart = outputLoopStart + loopCount * outputLoopDuration;
|
|
1688
1701
|
const renderDuration = isLoop
|
|
1689
|
-
? alignedLoopStart +
|
|
1690
|
-
: audioBuffer.duration;
|
|
1691
|
-
const
|
|
1702
|
+
? alignedLoopStart + outputLoopDuration
|
|
1703
|
+
: audioBuffer.duration / playbackRate;
|
|
1704
|
+
const sampleRate = this.audioContext.sampleRate;
|
|
1705
|
+
const offlineContext = new OfflineAudioContext(audioBuffer.numberOfChannels, Math.ceil(renderDuration * sampleRate), sampleRate);
|
|
1692
1706
|
const bufferSource = new AudioBufferSourceNode(offlineContext);
|
|
1693
1707
|
bufferSource.buffer = audioBuffer;
|
|
1694
|
-
bufferSource.playbackRate.value =
|
|
1708
|
+
bufferSource.playbackRate.value = playbackRate;
|
|
1695
1709
|
bufferSource.loop = isLoop;
|
|
1696
1710
|
if (isLoop) {
|
|
1697
|
-
bufferSource.loopStart =
|
|
1698
|
-
bufferSource.loopEnd =
|
|
1711
|
+
bufferSource.loopStart = sampleLoopStart;
|
|
1712
|
+
bufferSource.loopEnd = sampleLoopStart + sampleLoopDuration;
|
|
1699
1713
|
}
|
|
1700
1714
|
const initialFreq = this.clampCutoffFrequency(this.centToHz(voiceParams.initialFilterFc));
|
|
1701
1715
|
const filterEnvelopeNode = new BiquadFilterNode(offlineContext, {
|
|
@@ -1727,7 +1741,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1727
1741
|
isLoop,
|
|
1728
1742
|
adsDuration,
|
|
1729
1743
|
loopStart: alignedLoopStart,
|
|
1730
|
-
loopDuration,
|
|
1744
|
+
loopDuration: outputLoopDuration,
|
|
1731
1745
|
});
|
|
1732
1746
|
}
|
|
1733
1747
|
async createAdsrRenderedBuffer(note, voiceParams, audioBuffer, noteDuration) {
|
|
@@ -1825,7 +1839,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1825
1839
|
}
|
|
1826
1840
|
async createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent = {}) {
|
|
1827
1841
|
const { startTime: noteStartTime = 0, events: noteEvents = [] } = noteEvent;
|
|
1828
|
-
const ch =
|
|
1842
|
+
const ch = channel.channelNumber;
|
|
1829
1843
|
const releaseEndDuration = voiceParams.volRelease * releaseCurve * 5;
|
|
1830
1844
|
const totalDuration = noteDuration + releaseEndDuration;
|
|
1831
1845
|
const sampleRate = this.audioContext.sampleRate;
|
|
@@ -1874,7 +1888,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1874
1888
|
const audioBufferId = this.getVoiceId(channel, noteNumber, velocity);
|
|
1875
1889
|
if (!realtime) {
|
|
1876
1890
|
if (cacheMode === "note") {
|
|
1877
|
-
return await this.getFullCachedBuffer(note, audioBufferId);
|
|
1891
|
+
return await this.getFullCachedBuffer(channel, note, audioBufferId);
|
|
1878
1892
|
}
|
|
1879
1893
|
else if (cacheMode === "adsr") {
|
|
1880
1894
|
return await this.getAdsrCachedBuffer(note, audioBufferId);
|
|
@@ -1965,7 +1979,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1965
1979
|
durationMap.set(cacheKey, renderPromise);
|
|
1966
1980
|
return await renderPromise;
|
|
1967
1981
|
}
|
|
1968
|
-
async getFullCachedBuffer(note, audioBufferId) {
|
|
1982
|
+
async getFullCachedBuffer(channel, note, audioBufferId) {
|
|
1969
1983
|
const voiceParams = note.voiceParams;
|
|
1970
1984
|
const timelineIndex = note.timelineIndex;
|
|
1971
1985
|
const noteEvent = this.noteOnEvents.get(timelineIndex);
|
|
@@ -1990,7 +2004,7 @@ class MidyGM1 extends EventTarget {
|
|
|
1990
2004
|
}
|
|
1991
2005
|
const renderPromise = (async () => {
|
|
1992
2006
|
try {
|
|
1993
|
-
const rendered = await this.createFullRenderedBuffer(
|
|
2007
|
+
const rendered = await this.createFullRenderedBuffer(channel, note, voiceParams, noteDuration, noteEvent);
|
|
1994
2008
|
durationMap.set(cacheKey, rendered);
|
|
1995
2009
|
return rendered;
|
|
1996
2010
|
}
|
|
@@ -2017,7 +2031,6 @@ class MidyGM1 extends EventTarget {
|
|
|
2017
2031
|
note.renderedBuffer = isRendered ? audioBuffer : null;
|
|
2018
2032
|
note.bufferSource = this.createBufferSource(voiceParams, audioBuffer);
|
|
2019
2033
|
note.volumeNode = new GainNode(audioContext);
|
|
2020
|
-
note.volumeNode.gain.setValueAtTime(1, now);
|
|
2021
2034
|
const cacheMode = this.cacheMode;
|
|
2022
2035
|
const isFullCached = isRendered && audioBuffer.isFull === true;
|
|
2023
2036
|
if (cacheMode === "none") {
|
|
@@ -2094,9 +2107,6 @@ class MidyGM1 extends EventTarget {
|
|
|
2094
2107
|
startTime = this.audioContext.currentTime;
|
|
2095
2108
|
const note = new Note(noteNumber, velocity, startTime);
|
|
2096
2109
|
note.channel = channelNumber;
|
|
2097
|
-
const channel = this.channels[channelNumber];
|
|
2098
|
-
note.index = channel.scheduledNotes.length;
|
|
2099
|
-
channel.scheduledNotes.push(note);
|
|
2100
2110
|
return note;
|
|
2101
2111
|
}
|
|
2102
2112
|
async setupNote(channelNumber, note, startTime) {
|
|
@@ -2119,6 +2129,8 @@ class MidyGM1 extends EventTarget {
|
|
|
2119
2129
|
note.voice = soundFont.getVoice(bank, programNumber, note.noteNumber, note.velocity);
|
|
2120
2130
|
if (!note.voice)
|
|
2121
2131
|
return;
|
|
2132
|
+
note.index = channel.scheduledNotes.length;
|
|
2133
|
+
channel.scheduledNotes.push(note);
|
|
2122
2134
|
await this.setNoteAudioNode(channel, note, realtime);
|
|
2123
2135
|
this.setNoteRouting(channelNumber, note, startTime);
|
|
2124
2136
|
note.resolveReady();
|
|
@@ -2164,18 +2176,8 @@ class MidyGM1 extends EventTarget {
|
|
|
2164
2176
|
const volRelease = endTime + volDuration;
|
|
2165
2177
|
note.volumeNode.gain
|
|
2166
2178
|
.cancelScheduledValues(endTime)
|
|
2167
|
-
.setValueAtTime(1, endTime)
|
|
2168
2179
|
.setTargetAtTime(0, endTime, volDuration * releaseCurve);
|
|
2169
|
-
|
|
2170
|
-
this.scheduleTask(() => {
|
|
2171
|
-
note.bufferSource.loop = false;
|
|
2172
|
-
note.bufferSource.stop(volRelease);
|
|
2173
|
-
this.disconnectNote(note);
|
|
2174
|
-
channel.scheduledNotes[note.index] = undefined;
|
|
2175
|
-
this.releaseFullCache(note);
|
|
2176
|
-
resolve();
|
|
2177
|
-
}, volRelease);
|
|
2178
|
-
});
|
|
2180
|
+
note.bufferSource.stop(volRelease);
|
|
2179
2181
|
}
|
|
2180
2182
|
else {
|
|
2181
2183
|
const now = this.audioContext.currentTime;
|
|
@@ -2185,15 +2187,16 @@ class MidyGM1 extends EventTarget {
|
|
|
2185
2187
|
this.releaseFullCache(note);
|
|
2186
2188
|
return Promise.resolve();
|
|
2187
2189
|
}
|
|
2188
|
-
|
|
2189
|
-
this.scheduleTask(() => {
|
|
2190
|
-
this.disconnectNote(note);
|
|
2191
|
-
channel.scheduledNotes[note.index] = undefined;
|
|
2192
|
-
this.releaseFullCache(note);
|
|
2193
|
-
resolve();
|
|
2194
|
-
}, naturalEndTime);
|
|
2195
|
-
});
|
|
2190
|
+
note.bufferSource.stop(naturalEndTime);
|
|
2196
2191
|
}
|
|
2192
|
+
return new Promise((resolve) => {
|
|
2193
|
+
note.bufferSource.onended = () => {
|
|
2194
|
+
this.disconnectNote(note);
|
|
2195
|
+
channel.scheduledNotes[note.index] = undefined;
|
|
2196
|
+
this.releaseFullCache(note);
|
|
2197
|
+
resolve();
|
|
2198
|
+
};
|
|
2199
|
+
});
|
|
2197
2200
|
}
|
|
2198
2201
|
const volDuration = note.voiceParams.volRelease;
|
|
2199
2202
|
const volRelease = endTime + volDuration;
|
|
@@ -2214,45 +2217,33 @@ class MidyGM1 extends EventTarget {
|
|
|
2214
2217
|
const noteOffTime = note.startTime + (rb.noteDuration ?? 0);
|
|
2215
2218
|
const isEarlyCut = endTime < noteOffTime;
|
|
2216
2219
|
if (isEarlyCut) {
|
|
2217
|
-
const volRelease = endTime + volDuration;
|
|
2218
2220
|
note.volumeNode.gain
|
|
2219
2221
|
.cancelScheduledValues(endTime)
|
|
2220
|
-
.setValueAtTime(1, endTime)
|
|
2221
2222
|
.setTargetAtTime(0, endTime, volDuration * releaseCurve);
|
|
2222
|
-
|
|
2223
|
-
this.scheduleTask(() => {
|
|
2224
|
-
note.bufferSource.stop(volRelease);
|
|
2225
|
-
this.disconnectNote(note);
|
|
2226
|
-
channel.scheduledNotes[note.index] = undefined;
|
|
2227
|
-
resolve();
|
|
2228
|
-
}, volRelease);
|
|
2229
|
-
});
|
|
2223
|
+
note.bufferSource.stop(volRelease);
|
|
2230
2224
|
}
|
|
2231
2225
|
else {
|
|
2232
|
-
|
|
2233
|
-
this.scheduleTask(() => {
|
|
2234
|
-
note.bufferSource.stop();
|
|
2235
|
-
this.disconnectNote(note);
|
|
2236
|
-
channel.scheduledNotes[note.index] = undefined;
|
|
2237
|
-
resolve();
|
|
2238
|
-
}, naturalEndTime);
|
|
2239
|
-
});
|
|
2226
|
+
note.bufferSource.stop(naturalEndTime);
|
|
2240
2227
|
}
|
|
2228
|
+
return new Promise((resolve) => {
|
|
2229
|
+
note.bufferSource.onended = () => {
|
|
2230
|
+
this.disconnectNote(note);
|
|
2231
|
+
channel.scheduledNotes[note.index] = undefined;
|
|
2232
|
+
resolve();
|
|
2233
|
+
};
|
|
2234
|
+
});
|
|
2241
2235
|
}
|
|
2242
2236
|
note.volumeNode.gain
|
|
2243
2237
|
.cancelScheduledValues(endTime)
|
|
2244
|
-
.setValueAtTime(1, endTime)
|
|
2245
2238
|
.setTargetAtTime(0, endTime, volDuration * releaseCurve);
|
|
2246
2239
|
}
|
|
2240
|
+
note.bufferSource.stop(volRelease);
|
|
2247
2241
|
return new Promise((resolve) => {
|
|
2248
|
-
|
|
2249
|
-
const bufferSource = note.bufferSource;
|
|
2250
|
-
bufferSource.loop = false;
|
|
2251
|
-
bufferSource.stop(volRelease);
|
|
2242
|
+
note.bufferSource.onended = () => {
|
|
2252
2243
|
this.disconnectNote(note);
|
|
2253
2244
|
channel.scheduledNotes[note.index] = undefined;
|
|
2254
2245
|
resolve();
|
|
2255
|
-
}
|
|
2246
|
+
};
|
|
2256
2247
|
});
|
|
2257
2248
|
}
|
|
2258
2249
|
noteOff(channelNumber, noteNumber, _velocity, endTime, force) {
|
|
@@ -2808,9 +2799,10 @@ class MidyGM1 extends EventTarget {
|
|
|
2808
2799
|
setMasterVolume(value, scheduleTime) {
|
|
2809
2800
|
if (!(0 <= scheduleTime))
|
|
2810
2801
|
scheduleTime = this.audioContext.currentTime;
|
|
2802
|
+
const timeConstant = this.perceptualSmoothingTime / 5; // 99.3% (5 * tau)
|
|
2811
2803
|
this.masterVolume.gain
|
|
2812
|
-
.
|
|
2813
|
-
.
|
|
2804
|
+
.cancelAndHoldAtTime(scheduleTime)
|
|
2805
|
+
.setTargetAtTime(value * value, scheduleTime, timeConstant);
|
|
2814
2806
|
}
|
|
2815
2807
|
handleSysEx(data, scheduleTime) {
|
|
2816
2808
|
switch (data[0]) {
|
package/script/midy-GM2.d.ts
CHANGED
|
@@ -94,7 +94,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
94
94
|
reverbEffect: {
|
|
95
95
|
input: any;
|
|
96
96
|
output: any;
|
|
97
|
-
}
|
|
97
|
+
};
|
|
98
98
|
chorusEffect: {
|
|
99
99
|
input: any;
|
|
100
100
|
output: any;
|
|
@@ -116,7 +116,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
116
116
|
gainR: any;
|
|
117
117
|
merger: any;
|
|
118
118
|
};
|
|
119
|
-
createChannels(
|
|
119
|
+
createChannels(): Channel[];
|
|
120
120
|
decodeOggVorbis(sample: any): Promise<any>;
|
|
121
121
|
createAudioBuffer(voiceParams: any): Promise<any>;
|
|
122
122
|
isLoopDrum(channel: any, noteNumber: any): boolean;
|
|
@@ -148,24 +148,13 @@ export class MidyGM2 extends EventTarget {
|
|
|
148
148
|
currentTime(): number;
|
|
149
149
|
processScheduledNotes(channel: any, callback: any): Promise<void>;
|
|
150
150
|
processActiveNotes(channel: any, scheduleTime: any, callback: any): Promise<void>;
|
|
151
|
-
createConvolutionReverbImpulse(audioContext: any, decay: any, preDecay: any): any;
|
|
152
|
-
createConvolutionReverb(audioContext: any, impulse: any): {
|
|
153
|
-
input: any;
|
|
154
|
-
output: any;
|
|
155
|
-
convolverNode: any;
|
|
156
|
-
};
|
|
157
|
-
createCombFilter(audioContext: any, input: any, delay: any, feedback: any): any;
|
|
158
|
-
createAllpassFilter(audioContext: any, input: any, delay: any, feedback: any): any;
|
|
159
151
|
generateDistributedArray(center: any, count: any, varianceRatio?: number, randomness?: number): any[];
|
|
160
|
-
|
|
152
|
+
setReverbEffect(algorithm: any): void;
|
|
153
|
+
createReverbEffect(algorithm: any): {
|
|
161
154
|
input: any;
|
|
162
155
|
output: any;
|
|
163
156
|
};
|
|
164
|
-
|
|
165
|
-
input: any;
|
|
166
|
-
output: any;
|
|
167
|
-
} | undefined;
|
|
168
|
-
createChorusEffect(audioContext: any): {
|
|
157
|
+
createChorusEffect(): {
|
|
169
158
|
input: any;
|
|
170
159
|
output: any;
|
|
171
160
|
sendGain: any;
|
|
@@ -200,7 +189,7 @@ export class MidyGM2 extends EventTarget {
|
|
|
200
189
|
getAudioBuffer(channel: any, note: any, realtime: any): Promise<any>;
|
|
201
190
|
getAdsCachedBuffer(channel: any, note: any, audioBufferId: any, realtime: any): Promise<any>;
|
|
202
191
|
getAdsrCachedBuffer(channel: any, note: any, audioBufferId: any): Promise<any>;
|
|
203
|
-
getFullCachedBuffer(note: any, audioBufferId: any): Promise<any>;
|
|
192
|
+
getFullCachedBuffer(channel: any, note: any, audioBufferId: any): Promise<any>;
|
|
204
193
|
setNoteAudioNode(channel: any, note: any, realtime: any): Promise<any>;
|
|
205
194
|
handleExclusiveClass(note: any, channelNumber: any, startTime: any): void;
|
|
206
195
|
handleDrumExclusiveClass(note: any, channelNumber: any, startTime: any): void;
|
|
@@ -353,7 +342,8 @@ export class MidyGM2 extends EventTarget {
|
|
|
353
342
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
354
343
|
}
|
|
355
344
|
declare class Channel {
|
|
356
|
-
constructor(audioNodes: any, settings: any);
|
|
345
|
+
constructor(channelNumber: any, audioNodes: any, settings: any);
|
|
346
|
+
channelNumber: number;
|
|
357
347
|
isDrum: boolean;
|
|
358
348
|
programNumber: number;
|
|
359
349
|
scheduleIndex: number;
|
package/script/midy-GM2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy-GM2.d.ts","sourceRoot":"","sources":["../src/midy-GM2.js"],"names":[],"mappings":"AA4TA;IAgEE;;;;;;;;;;;;;;MAcE;IAEF,6CAuBC;IAlGD,gCAAgC;IAChC,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAsB;IACtB,+BAA6B;IAC7B,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAA2C;IAC3C,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IAEF,8BAA2B;IAE3B,+BAA4B;IAC5B,4BAAyB;IACzB,8BAA2B;IAE3B,0BAA2B;IAC3B,qBAAoB;IACpB,4BAA6B;IAoB3B,kBAAgC;IAChC,eAAwD;IACxD,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,kCAAyE;IACzE,sBAAiD;IACjD,oBAAqC;IACrC;;;MAAkE;IAClE;;;;;;;;MAA6C;IAQ/C,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCAYC;IAED,6BAqJC;IAED,sBAuCC;IAED,6EAiBC;IAED;;;;MAWC;IAED,4BAQC;IAED,2CAsBC;IAED,kDA6BC;IAED,mDAIC;IAED,6FAqBC;IAED,gEA2DC;IAED,mCASC;IAED,uBAWC;IAED,yDA4CC;IAED,iCA4EC;IAED,2BAuFC;IAED,uDAEC;IAED,wDAEC;IAED,qCAMC;IAED;;;MAqFC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,oCAqMC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAoBC;IAED,wBAYC;IAED,sBAOC;IAED,kEAWC;IAED,kFAYC;IAED,sGAcC;IAED,sCAIC;IAED;;;MA4DC;IAED;;;;;;;;MA2CC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAWC;IAED,2DASC;IAED,oDAEC;IAED,6CAIC;IAED,mDAIC;IAED,2CAoDC;IAED,8EASC;IAED,oEAiBC;IAED,sEASC;IAED,4DAMC;IAED,6EAOC;IAED,qDAkBC;IAED,6CAIC;IAED,8EAmBC;IAED,oEAgCC;IAED,kEAwBC;IAED,+DAgBC;IAED,gIAyEC;IAED,kIA0GC;IAED,gIA6DC;IAED,qEAwBC;IAED,6FAuCC;IAED,+EAgDC;IAED,+EA0CC;IAED,uEAqFC;IAED,0EAiBC;IAED,8EAoBC;IAED,oEAyBC;IAED,yFAQC;IAED,qFAKC;IAED,uEAiCC;IAED,gCAoBC;IAED,kCAWC;IAED,iEAkFC;IAED,4FAqBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,uFAkBC;IAED,+BAuBC;IAED,kDAOC;IAED,sBAEC;IAED,mFAcC;IAED,4EAYC;IAED,wFAGC;IAED,sEAWC;IAED,mEAaC;IAED,mEAYC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,8CAOC;IAED,gEAMC;IAED;;;;;;;;;;;;MAwDC;IAED,oFAMC;IAED,6EAgCC;IAED,qCA2BC;IAED,+FAeC;IAED,+CAEC;IAED,wDAWC;IAED,4EAMC;IAED,wDAeC;IAED,2EAMC;IAED,mEAKC;IAED,mDAQC;IAED;;;MAMC;IAED,gEAWC;IAED,uEAKC;IAED,+CAEC;IAED,sEAGC;IAED,2DAWC;IAED,4EAoBC;IAED,yEAgBC;IAED,+CAEC;IAED,uEAMC;IAED,2EAkBC;IAED,oDAEC;IAED,0EAeC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,uDAuBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAWC;IAED,iEAMC;IAED,uEASC;IAED,mEAKC;IAED,yEASC;IAED,2EAKC;IAED,iFAMC;IAED,gFAGC;IAED,6CAsBC;IAGD,8EAoCC;IAED,gFAGC;IAED,iEAEC;IAED,gEAEC;IAED,gEAIC;IAED,gEAIC;IAED,+EAgCC;IAED,qCAaC;IAED,qCAaC;IAED,4EAwCC;IAED,4DAGC;IAED,qDAMC;IAED,gEAIC;IAED,yDAYC;IAED,kEAGC;IAED,2DAYC;IAED,sEAeC;IAED,4CAOC;IAED,+BAIC;IAED,qDAiBC;IAED,gCAGC;IAED,kCAEC;IA6BD,4CAEC;IAED,+DAaC;IAED,kDAiBC;IAED,2GAKC;IAED,sDAIC;IAED,qCAEC;IAED,uDAMC;IAED,sCAEC;IAED,uDASC;IAED,sCAEC;IAED,2DAqBC;IAED,0CAEC;IAED,mCAeC;IAED,2FAgBC;IAED,wDAEC;IAED,+DAGC;IAED,qEASC;IAED,uEAOC;IAED,6CAEC;IAED,iDAEC;IAED,6CAEC;IAED,iDAEC;IAED,0CAEC;IAED,uCAEC;IAED,wCAEC;IAED,2CAEC;IAED,8BAyBC;IAED,0EAQC;IAED,4EAOC;IAED,qFASC;IAED,+DAEC;IAED,wEAcC;IAED,6DAiBC;IAED,yEAIC;IAED,0CAmBC;IAED,yEAcC;IAED,gDAYC;IAGD,6DAgBC;CACF;AAxhID;IA2BE,gEAKC;IA/BD,sBAAkB;IAClB,gBAAe;IACf,sBAAkB;IAClB,sBAAkB;IAClB,eAAW;IACX,gBAAc;IACd,gBAAY;IACZ,gBAAY;IACZ,gBAAY;IACZ,eAAa;IACb,eAAa;IACb,cAAa;IACb,6BAA0B;IAC1B,mBAAe;IACf,qBAAiB;IACjB,sBAAoB;IACpB,oBAAkB;IAClB,sBAAoB;IACpB,qCAAmD;IACnD,+CAA2C;IAC3C,6CAA4D;IAC5D,sCAAkD;IAClD,sBAAgC;IAChC,sBAAgC;IAChC,0BAA2B;IAMzB,uBAAkC;IAGpC,mCAEC;IAED,mBAKC;CACF;AAuID;IAUE,oCASC;IAlBD,YAAO;IACP,YAAO;IACP,YAAO;IACP,iBAAY;IACZ,eAAU;IACV,kBAAa;IACb,kBAAa;IACb,qBAAgB;CAYjB;AAvOD;IAsBE,4DAOC;IA5BD,WAAM;IACN,iBAAY;IACZ,yBAAyB;IACzB,cAAW;IACX,gBAAe;IACf,kBAAa;IACb,oBAAqB;IACrB,qBAAsB;IACtB,uBAAwB;IACxB,wBAAmB;IACnB,wBAAmB;IACnB,YAAO;IACP,mBAAc;IACd,sBAAiB;IACjB,oBAAe;IACf,YAAO;IACP,mBAAc;IACd,gBAAW;IACX,gBAAW;IACX,6BAA0B;IAGxB,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,oBAEE;IADA,mCAA2B;CAGhC;AAsHD;IACE,iCAA8B;CAa/B"}
|