Spectral "Compensation"?

Yeah, that’s a smell: it depends not only the material, but also the settings (because, although the FFT sizes of carrier and modulator can be different, I didn’t trouble my self to compensate for the different numbers that would come out). If you want to enjoy something more predictable, perhaps normalise the right hand spectral envelope after the fl.exp~.

Whoops, thanks for catching.

Here’s some code that presents a central spectral envelope estimate (as in Owen’s patch but coded a little differently) and resynthesises a real time input frame by frame using the spectral envelope as the amplitudes and random phases. Unlike Owen’s (@weefuzzy) code this doesn’t normalise the envelope so the amplitude od the signal is included in the estimate. From this code we should be able to build a sample accurate granular process that picks two grains from different sources and spectrally correct one to be like the other…


----------begin_max5_patcher----------
2730.3ocybs0iiaaE9YO+JH7SaVL6rhj5ZPeYQKBZARQCPSQQwhhAx1zd3t5
VknmKIH92d4MYKYKISaS4wCvXCQRIcNe7bmj92uaxzY4uRplB9QvWASl762M
YhrIQCSzWOYZZ7qyShqjCaZUAYNqbc5hx3W1L8d0HVlmwxhSIxQ7kRZbRcOE
wr4OQyV8XI+1TuGWO3CN2C7CQhubcbDeA84eA9u56JacJMKgvjuR2Fujkwyk
uDmcCLeMqdjPcqzERBIe129jOplRTii8VAQQFSmt80IdxUzeS1AjSUhV+i6t
S7w8FBKYjW3ut52Ei7pjYmtL4AxqEka.eflAAeDf3+WP+Avm3eNDDwwFu6AX
uHI1fcEegP8gPPiQC3PngUY6x3rE4oaFhIQQJA.obfu+v7HxXdzwx7377zTR
F6.l7moKYjRNOA9PUZbRBoDPq.o4kDPUZdNSvt+v.7uO1WLIiBUytNX0Wm1j
ryg.fWzzwXlD74z7ED.MqXMy.QWLTI5hrzzpWvUSzsHOgkOOtbHgWTTjfMcc
TroyYI8h5fM86mMu+bY0z0ILZUBcAor9oWQXbxiOJ0CWZCl+gSj5uf.e2P7V
doK.PJt55JuSjWn3qvfSS3sK9GtCzK4dT3ZXORxhmkzxreeXSMyoskibbirn
B+eNOsfjUEyHfk4kf7mIkIwECZgyUHj3EEH9BhirjFtKztZ3LZJoZCe9G4cb
QduH4LensTrwQWI60+5SDvKTtsrWD1rmWOYRyy.wK915JVEuwRA+l7lbBlwu
gUwzLtMuEqmSV.l8lrM0CAvMKBpVmlJdZDJuiRPEWECjuTNpe5m90iKZ3i8j
N+rmnQ3TKBY+aImN.a3wcdiDx1ARC.d1xGFJxlrgqSjOnJNsHgq4JrpTw+JO
E72+m+BHgOMNz7TjNDrPEmgrDCB8rIC9WyKD1739gPtfO3Bds13zPwefTgU5
FHYPOWawYt103jRaaC3o3rLvmmuyFbQ9KRtjlYfQKsjI1wRVsBtRFs9ke9K+
GvW9W+k+1+XHsvHk6WosDXfsTB8OmIxhj32lEWND0prUnj9vHc5eWbjCPzfQ
NQ4f64E7DopJdE4fYlbtb3Yk+qGRNOoBPFGXIARny6ZhtUKES7atD.ITEQYj
khjNrW7nhtJSPPfoyhyV0O5TGMY7yjEOxejbB9wXFqjNaMSUzjIaAINrEWQm
yVmQEOxeTDY785dVlmjj+xpj7YwILRZQdC8MQukowYLcnG7nQZ0qHmKIKIe7
SqaNujthlIR5LaE6IEeg8vhPLQN5+fnPGu.NWxny+d0V1b2MukVfBkvl+gBq
GaAkOc0Cs8+VGmPYu0A4ICnjUR32qN+BkpmRX6J3af6TfLnQHseAcbK090ub
0PzUKK0mdqHmcdJbZlGohj2yVUdAE7dWqM5xkrMfOmIToRnU7.htD7wCFbAI
22E.8tWLxCvGvm42oxJBvmGkj+EIPgfFoMYrOcjyTyx3eTAsp70kyIbbSiSh
zItDXRmLwQqMF9RJ7Mz+5HqQ9sEwyMnRYAbm7hBlIc0K97Tzk5pJmVLKiOJp
8g6kLk5GHMU3ZK2HtGK3kqjjOM66WjKFc8MfVy+J91.X3YSPJeNNYiLk6yBg
vJ+tAx3ci7Myh44YJ3c0qSRd7BQNThxK6MXZgxJhgTVHBCrzRdgwWmHxJ.pU
FMN4QR1yjDd5gGW8ndURf1JBCrIQXHoGR49IvrjlPdlTVoCyGVGLebQQilmz
3VDHy2xkOn5DF3MQyTM4rsoRxyz562eaqwkbTgwgj0kJMlW8q0jzI9TlslJI
EUi74HMIImMDZZUEZkA4jVc26vYnSTipa4Bgp.dc2Az7oadlYy+NYQqbaDY2
SyJJIUjLV7Ao9rfrLdcB6wtSYrc+6ou1tyNMWLY5pR5h7LYIFZNUHZt90wYN
ksUulLibDYwEcbypLX6oyJNSttZVboXlRuZKnsoykmmztqs2WBYIS2cAMKaO
TjkWzem7rPeZf6cVNuyzgd1xdpdbclp2G4BErGEYq2db7rj05rse7uFmQS4I
KJRVUsZQa6TshSOUMujm5dK9U0yyczyBtP9bxKzEp7wcZJLvGNsnVHZ51Y4E
zU7zja2FKdUU6VpXuo.8FMsdlVI9QQR7Ibtn8.ZssNZpw1z5Vq1GxJ2goQTl
mxG9ll82iUNY9.NOD4Bcv5EWLJLPDO39l750He+l95np5M5nOC96JDwjZC+1
Gh93QAmPUoGBjE.8vBS2qWfS.NbuYfiOuAfNFfn1sKHUHi5Ebwx.B9lAPDpO
GGRTxHXGYzPdiBjftYfj+zwTYTwJi0qkCZTfC3MCbPds3X.hqJrFtfgv9pac
4accuW2kksuFDdyfNhJYYF5fvGhNJaLmK5f5AcNh2m6uw7.ovGbXGROdtift
kezMizym1.fGy1qSK2QQigwFmaG2QzLCs9p7EAcGC.4VR.wPwi.kkDc8usJZ
b6XrUU3aSgjtB22jXWNc2Q2VQyAI6EfYu1bijI+DNFFYucBmqLNsnqcM7v1W
5T5ABGCqM92NYCPMNbFna3g3ynjrj+si2oj7UFhNpUfzcLJtf20z6jjNMK9M
zt5GfcFhicNYaIGkiazc8NXqYcnjOurEjWaTE2qF7nq9zHhOXGahOHKhOJZw
r7ih5H9eSfq9Ufb5AtZEx8YIurqP2hc3SOU3Txph96FnTKmudNp1PGnMitfT
wnYaq6+W2FuwdiKktnHmlwzThGVt99gdO3tuIZDLrm9Z8.yKWnVYFyzVNYVE
aHqxi8D.2S9MQstNeE.0mVD8GvGFDTBkLNx2+A2.GOXMi6KCXV4W+v95FTbd
eAknCFm4fxHOwFdBr.zPOUmJMDXHM.OTeajQGnyIH16LRviwlY5Pdzb6Lgml
YFznvpHC4TunQDu8hLEucFQpvThPT34QiHfnSgJd2sObT4esyTjtrK96t5Z5
2.ZpeCw5vcDFRyB9pk1PcfAkWMVRDtlR6nwTtDZpJ5X52x2TcTQA9GMrn9ge
bpXLcRA8NEYZ36tqxn9Ck.+9RZcfjl6EG6bZtwGGCbHSULFSaD3SEvGGsSSC
vF2ue7smAlS6fEcRaeH0oLRu4f1t4x5X2EMFGGGVdiMEz.+nAn9QS3vkD3L2
hmHWKuEOWljyeo0OTdWzT9khW91CEFmNqab6N8Znc0ZnhkctjCFg7jhwZrIJ
asVhgm8ObB5SAWCfRRcsKwhB21WsQidGpz1TaoOa2sBJceiiX0hI46q9Qhw2
QtcxEWs8NZa86f4XioUjADKx0.hEGH+EcAq9EPQbwgzJ7hnUenAzp32PjcEu
YeZ0Us3S3HIhhU67b4U8nqXJs4EXxjdCyim8aRbrfZvf8fBsIGKIrrG11ivB
ZWrQW1axwj2zkBmFo.rG4XI3DYxqNvVhLGEMCLPIGoNe8Mu5ZHNKoscCxnBO
1ipOxWczyc82dkssSYjIUGaLu5ZhrqUL5Xh4MrMzGMwFOz2BlXflnTDZCNBc
sdQFYzzF1LM3831sEyKSyBGYhXnE3PiTrZYSxR9DL8Eacn0HE7HK.sglpf2q
kbOrLsB81cP6KRd0kJWahfMzJppglZOcHuddG2qmmZeVgg9pew972dUG47r2
gcSP76cH216.tc3gaq+C119GpMYk.56vrc2eb2+GBpg1j
-----------end_max5_patcher-----------
1 Like

Ooooh, really nice!

Ok, I put together a test patch using @a.harker’s first patch using HIRT (since I can wrap my head around that a bit more).

convolved.zip (25.9 KB)

You can analyze/create a corpus in the patch itself, or just use one of the ones from here:
http://rodrigoconstanzo.com/party/corpora_v3.2.zip
(just the audio file and .txt file)

Because it is all buffer~-based, there’s some fluid.bufcompose~ involved, and then at the tail end I’m just play~-ing the snd3 directly, rather than adding a multiconvolve~ to the poly~, which would probably be a better solution than this.

As a result the timing is real jittery, and it sounds a bit choppy too. It’s possible I fucked up the irtrimnorm~ messaging, but it was throwing up errors since my buffer~/grain size was smaller than your starting crop.

I suspect doing it in FrameLib will probably be the way to go in the end, since it wont have the “copying things around a buffer and then waiting for output bangs” slop that this presently does (among other problems).

The specifics of @a.harker’s last patch is a bit confusing to me, but the prospect of what it does is quite exciting!

So some general questions, along with some specific questions.

So would that render amplitude compensation useless? Or rather, would it be desire-able to not retain the original amplitude and then treat amplitude compensation separately? (although I suppose the new spectral envelope would have an impact on the amplitude either way? (perhaps it can retain the amplitude of the matched grain, so compensating for the input grain would still work?))

So would that just be a function of how much smoothing is applied? Or can it be parameterized in terms of how much spectral compensation to add (similar to what I have now for Loudness and Pitch compensation, where you have 0->100% as a parameter)

Lastly, in C-C-Combine all of the analysis and playback happens in 40ms windows. That’s just something I arrived at by doing some testing of different grain lengths until I found something that sounded good across lots of material. That comes out to 1764 samples (at 44.1k), which is not a nice power of 2 number, which is quite common for this spectral/FFT-y stuff. The nearest is 2048 which comes out to 46.44ms (at 44.1k). Would it be beneficial to adjust my analysis/playback to be 46.44ms windows instead to avoid incomplete windows and such? (it would require completely redoing all my corpora and the underlying C-C-Combine code) Or does it not matter in the way I’m thinking?

In terms of amplitude compensation then once the spectra have been compensated then the amplitudes are probably quite matched - certainly the mashed amplitude is no longer relevant, so you either reanalyse and compensate that, or leave it as it is.

How much smoothing is exactly the issue with how close the match is - indeed you can have a 0->100% but 100% is a kind of moveable feast, so you’d need to figure out what you wanted that to equate to. If you smooth too little you’ll start translating pitched elements from the target.

The window length won’t be crucial for this in the long run - there isn’t an issue here with incomplete windows in the same way, as long as the windowing is done correctly.

Here’s proof of concept of realtime granular compensation using the cepstral spectral envelope technique. There’s quit e a lot wrong with this at the moment (it has a large unnecessary latency/linear phase filters/is not very flexible) but it gives some idea of what one might expect. I’ll code up a couple of new frame lib objects soon to experiment more with smoothing and allow be to change the phase of an FIR filter in frame lib which are the missing components.


----------begin_max5_patcher----------
2534.3oc6cs0bhiiE9YxuBW7zryjlnK95VyK6uh8gtlJkADD0iw1qsHI8L0v
u805hACXCBrLwOn7P51R1ny46bQGI+Ewe+zjoyy9jTN04e67cmIS96mlLQzD
ugIpqmLcS7mKRhKE21zTxGYy+wzmkcwHexDMmjEubCorzALCfp6MOls3MZ55
WKHKXxAIDGNC7rCJ.y+mv.wEnY.m+P8Loa2PSSHLwnAOzX1V1osRWJF5Jw4a
PX8XJuO1OyIxAb5Tm+f2y+7zS7e8rlp4hrMaHoryzy+KcI6Mme4M552HENzR
mDtRWtIKiw0z+0kT8Het1hABD.FDIzcvso6fVzcvz6PA6vNtJYV4azUrcNur
MkxJcJhYzrRmWDsVYc8bdYS1RhyGEw4WPYcwdy7d1w0UYg8urgFoqg1EXXCc
23vGzzkYerSCkLPXQ8CLjNhceX5HcUkoVCMDJzPrwzPrg0vUIYUC50y6nB97
.2SdmZ0aUVwlXwmq+4pFJ7fTTDugvHEuRRimmPZF9dtZ+ryz4woqMsA9EMrt
XUZXnqgLuH+GlC7a+LO6hdv9XXSCuwTwGWdnqDhpTPTfVJ3k8rapfnoWxW0n
JYtSYdk9TDmTEp7NIIqZnttEUppPnolZAcwjRMkGRgRGUJYUJAZB4cRQIMKs
wm9jow44MZdRiGgiL+HS7AE979lnoxl.6apf7Ns94822ZbQEpvpfjsEBYb5m
90SZv+XplftHcKUHJxFqrQJQRXMRqxLUlGuP9vbiVc2GvYHPTgBThytPAp64
6d.nqL2qSxV7mjkMk4oUluTZZdAorpBJd4CoG08Rxp3sIrWWkkxJo+kPDfUl
u15ekRDasStRHj++SAMNYuFrtftLKkKDGYJ3MWObUJmmT2ZpLh6HMNukGtx+
nBW5nyxJkba473BtkRknGU2IKKK43t1+bIjULU24zzzSPQVVd2cVTU+4Ed14
YUct4Re1hdJecapr2WqbJXuVF+9wnMKNIQEyd7G+mwozp4.ILpzDf.66TNY2
akKJxRRNRek87dK8rrxIeA4Cds0hApoyP0sSyqchlt2JujtlTxNtMV75xiao
j8SIn2nosyUAwuxHaxSpzhiugiVRTyH1lY2Np8Kkk67z4EUKsH9ycM6ukrbn
H05C.yhbg.bj5mvfmcBPmlxqyD8cm56rkQ30Th5ZVsI0I8UIUFDH5WuJ3DpV
EIPN290gCzMCGtiF33kcNnqAHdRuErHslZM1FFPviF.gG9bcHITUwun3VuAA
RPiFH42uVHib6FvdXINLHvAbz.GjOyuFf3JKqoxwfme0En9w08YUWFN+ZP3n
AcZrhhqfNH74niLGy8hNnNPmqL6yyirYfj3CNrEuGO2AH1xOZz387scNvqk6
EbzzQQCQxFv3Y5HZplYekyEAcGB.YL4fno6QfLSRDeSnLLZLdR1lPRWydSWH
osx80o1kae5nwU0bPxIEX1YN2HwheBGhjrimx4Jh2juS8lVno4aYZkeoUuGH
bHx13OdVM.U6xYftgmiOCxhk7GOyNkjsVSzAAk07M.Ya7djyNIjS8peCcX+C
vfKowfaNWxU03FcW+1latOThOuzkjOarKtOL3Qs6SCH9fAlDePFDejxhdqOJ
pk5+0At5N.BzAbcTI22k+xgM5Ngl10NbJTUd+sCTkYaKVTaiTUc5brdtjTxn
o621+ueXuA32nV1oaUHB0TH3BKbfjg.cEB7PhD7kQqkTTKtCiTnqSA9rabCc
YdFMkobOQvP4hCjqQv+vUG8TYEKkuSNvWq9.N6F2KYvAQx70M9q1wXXjB7MD
.BNIydh7Md9cGQ0Gf8+BN6whj5pCgxjH2kNbh2cnzc12ela.vCVWUpuxGGzZ
eORGeefttWWKP1CyUUXn2L2SK.WEi2ReOT6utpZKgb6EM7Wrng6gYH71rBnu
VUE50CUkSFnaQWGlfKOcycWCJChTfuUDePjBjtXAZHEBMkgZC2fHDPcqfi+B
pGrpYEe3ZIECoAAhuEr3xERpJczW99OiB1e0PI6naYkQClcDdKypMXRA3Fps
pcChpwZZrMkSUokuJok0qwLVAc9VlbQsM4k2MQen0IYyiSTjCZO4xZgcQOcP
3dbDYslrtFlHqAiEdrpzOSyiU2wJMVqsmllFqXjkFqVZrZowpkFqVZrZowpk
FqVZrZowpkFqVZrZowpkFqVZrZowpkFqVZrZowpkFqVZrZowpkFqVZrZowpk
FqVZrZowpkFqVZrZowpkFqVZrZowpkFqVZrZowpkFqVZrZowpkFq2BIO09PS
F45YzCM4vQz4Bc8QxpgUQzCSEWjk9dVx6D9d2G+o7U+3fQA96Q4NItXa3Am6
kUlbOj5n3EXJptB0fpqmxOSiBTEj3k6b9QV55DRIp9LSuLdSd002EVUGdHnR
59SI9qhUsvxTMvOviA+3ew.DulbF.VPxS3x78fSHrfvzt95bddqeHl6WpG07
sqVQJ16P4rfjjj8sUnYwzU8AkBkzD10yTGNzQcBSqRxhYMNMyG2dQxvKS6D4
8UmVhym4xcNfYndkuVRAn.iclo+0lt9W2wm5oZxm6BS7i74XRnHsrOxPPBr6
.oR55zJI5A.L+1AlPcWXhm57X2TXR3H.SRynkjc8AUfAGRsXhugaBFAnB+aG
FwphpJLTUUXu7bfRPBBuR7DtOU4.8+pSGmmrsbWepFDJoXlajoBw7FSk4fj+
med2U4HmEutHGS8WNHz8KnHGMWpgyKzTFoH2oZI9anLhIV4Q8pVUAidnAbkG
Qe4KbqAyzJH+usjRFY4gjZ75D5U.KRgdlp1IH9wfXj+ZY7hcWu1PeWwVOJWQ
gq2soes7kXlmg+NLil9m65UsuQhcX0MzTaUw3X1aQVi2iS10eWb4em1P.vTE
3zOGbw8bLkfjP0o6xqBvNe2cat4tZwziSdWtmYjL5H62780e5qEvUFGBk+wM
GTk51Sc04xJnexpNBKpwFfe2iDRmQBafABqkJAMgJ4pyHEYhQxSGeJWCLRQ5
nRFXbB0XbLg9DniWmITHWfNijITIc75BLz3.0Xbf8MfUGEBCMwHg0wqCXhjP
Hchi7MwHoiemIRfqC14MDymp6.CM8jinPcSdz4L4gx5pwtPQUnx+JFDWYZTR
Kgk+chntBa.9vUFGY80AYMQ0.HrtAh8M4BRqPdSjbAgzHyrXj5sNAz0op25j
tyAb3lzhfqm5i66BjGKUxZp8kKnmekwCH0A5P2gFYpR+izccJ801B0I0DzD0
IC0obOnIlMDpSFLn2kR2F.7km1S9xu0w81eUekMcVsvwV+1W.JBHBOpiY.tC
fWnNx5I03zgvBgxuh5ObkwWYOVWi9wtWxMy3jScM9fbxos1ImzZmeJq08Ir1
omtZBJo00op1S+yS+ev7.3zH
-----------end_max5_patcher-----------
1 Like

Might I suggest that might be because you appear to be editing snd3 as you play it back? You can’t do this with one buffer~. It would work with multiconvolve~ because that copies the buffer internally, but play~ references the buffer directly, so this patch probably isn’t really doing what you want right now.

Man, the results of this are suuuper promising!!

Yeah that makes sense.

I suppose something like that could happen inside the fl.verse~ as well(?). If I remember right, the fl.descriptors~y thing that @jamesbradbury whipped up in the other (still hidden?) forum didn’t have a loudness descriptor (yet). With all of this going quickly and sample accurately, it would be a shame to jump back out to Max-land just to calculate the loudness of a grain.

Indeed. I guess an important factor would be that 0% would equal no convolution at all (or at least the sound of no convolution). Unless I’m not understanding something, I can’t smooth the spectral envelope enough to do nothing can I? Maybe some kind of crossfade then?

The 100% will probably just be hand-tuned line the Loudness and Pitch compensations now. So it’s as effective as it can be without getting into cartoonish territory.

I did notice that at higher width values I tend to get a really low rumble/sub-bass, which I guess has to do with it over (under?) compensating frequencies that aren’t really there, and artificially boosting the extremes?

That’s good to know.

Indeed, you’re probably right. I just hacked something together just to see if I understood the idea enough. Obviously the specifics of the implementation aren’t correct.

Another thing that’s fundamentally different is that I’d be convolving a portion of a buffer against portion of another buffer, which from the looks of it is easy/possible in fl.land~. (fl.read~ can .read~ any part of any buffer and do it’s magic on that, and in this example it’s just reading from the same place in both buffers for the sake of simplicity)

Really fucking exciting!

Also, not sure if I’m running an older version of FrameLib or something, but all of the patches in this thread throw up this error in the Max console:

fl.max~: string 1e-13 in entry list where value expected

So - yes - descriptors~ in fl.land~ are totally possible, either with custom objects, or just building small patches. There are a variety of ways to build an amplitude one already, but loudness is a bit more complex - the descriptors~ object just applies a single perceptual curve to weight the amplitudes, which is doable in native fl objects if I could figure out where I got that curve from and why…

There are ways of getting smoothing 0% to be no convolution, either by special casing, or adapting the smoothing algorithm,. I’m a bit surprised it doesn’t work right now, actually. [after checking it turns out that I may (or may not) be wrong above above @weefuzzy and the “mistake” - I’ll investigate further, but there should be a way to end up with smoothing at 0 giving no EQ change without a special case - or there might need to be a special case that leaves only a single value before the iFFT],

As you say frame lib is made for things like grabbing specific bits of buffers a specific times and convolving them together or manipulating them in other interesting ways - those positions and the reading (including airspeed etc etc. can all be applied on-the-fly.

@weefuzzy today taught me that max understands scientific notation of numbers - I have no idea since what version. I will adapt framelib to silence the error when something that looks like a symbol yields an actual number, but mine gives me the same error.

1 Like

Here’s a version where the randomisation of the two sample positions is independent.


----------begin_max5_patcher----------
2605.3oc6cssjhiiD8YpuBG7zNyRSoa9BarureEyCcLQEFPP4dL1dsMUU8Lw
v29naFrAaP.xfePUDcQYIiUlmLUpTRmV9udYz34oeQKF67eb9tynQ+0KiFIJ
hWvH00iFuI7qEwgEhaabB8yz4+X7DYUkzuJEEuJd5lvrcNwQIzvbGfCj8OLf
8S0slEVt38nj0ukSWTJaw.LbJXhCDEH9fH9.glBb9c0WJY6lnjXZonsQGJLc
aYUoPUoQKEBBS39F1spQk2W4OynxVb7XmemWye+xK7eM4tU57vjkoa1cVkDH
zNf3COOSoidOLc7euW8VklTlDtQzPi+e4QgwmQw8TVWeW9G9PCo3H+yo30Dz
hn+TTAj0lFEOtdGcOIFXbGcHZ.4n64S5CG8GjedbZ3xMzhBGlziNa2YowyGy
+Hv+7ZITaKIzvp4hzManIkmnm+Vzxx2c9WuGs9cZtSTgSLWoK1jlVx0ze4bp
9LgMECjdw9yD5N35zcPK5NXrQcUKdOZU4NmW2lDUV3jGVFkV37pnTl00040M
oKoNelGlcFkkfcm5NwgPTVXS4NS.OrtreFw5x94NMTRegE0y2TiMQdX5XzJl
oVCMDJzPrwzPrg0vUworFs5gxpJZC6RdiOEbwfQpdjtfaIXDZ+Pl4aBEOWuV
FzM3.FmyR.njl+FMIbdLsde5SwhINimGlr1zV8W0vjiUwlgDSk3wiKiq2+YV
5YcqU4VUY3MlJ93BNcg9sJED4qkBddO65J3YRXZhgUxLmhLl9jGFy5p7AMNk
0TW1hJUUHzTi2fvZjtrPdn4JcTojrPBQwzOn4EQoI0d5iFGlkUq3Q09Jbj4G
ohGTvj8EEkHKBrunb5GQUeeu8kFlyPkRFjrMWNEiu7pFIg+XXiZmmrMRHJxB
Y1HkHIrF7olTjEtP9k4FsppOfyPfHsEnDmIPAp65QN.zLy853zE+AcYcYdLy
7kDkjkSKXoUwyoHoQ0KoqB2FW91wy7ns5WoDwVqr04WMZ757nkoIbgngofWb
UywTN4zLbqqLh6HILqkuLy+fgKcTYASI2VLOLmaoTA5QUUVllF2rp8euX5pR
U0YQIIGghkoYcWYNKozy7cmmxpby4d1hZJdaahr12XNEkuUD9QSztLLNV0ms
4i+qvjH1XfzxHoI.A1Wobvt2KVjmFG2Pek07QK0rj4juf9IOgaQCU2Yfc6QY
UNQi2akWFslVT1rrxv0EMKon7mRPuVQamq5D+VIcSVLSKZdCMVnm58XqGcqQ
4mKJ2ogyyYy2H7qc0quknbnYpIM.lNi.A3YpeB7m33iNNjWmA56Nz2Iysvst
D00nZipB5qBpzKPzudQvIPM0Rfbr8KCGnqFNHCF330cNnKAHtRuErHrFNnO.
D7fAP3cetLjDnx3Wjbqau.InACj7euTWF4ZPfcwRbnWfC3fANnekcI.gHSqg
4XviuR.peHjIppLb7U+fAC5TaFEW.cP3SQGYLlaEcPcfNWXzmICrQfj3CNnE
uGWROz2xa1fw64a6bfWJ1KnwvQy5ifMfgyvQQIZF8UNVDjzG.xPxAQS2C4d8
flwWDJCiFCmfswzj0kuqKjzV595j6x0ObzvJaNH8nDL6Ll6LwjeB5ifrCmz4
xC2jsSs8KQIYaK0J9RqdOPXeDswa3LafHsSmgucxmfO8xjk7FNiNEmtVSzAA
k470CQabejiNIjS8xeCcX8CvfyowfqNVxE03ZUWsEz0WGJwyKYI8qZqh6CCd
Tq9TOhOXfIwGjAwGorn27il0R9+5.Wc2ABzAb0Hk6axe4vBcyYjSGqvoPU40
2NPUjtMeQkMRk0oSS8bIsnLJY+x9+8CqM.+F0xNcsBQflBAWXg8jL3qqPf6S
jfOMZsjhJwsejBccJvmbiahVlkFkTpbOQv.4jCjyQv6vUM9Vo4Kk6IG34pOf
Stw8RFrWjLOc6+U4XzORA9J5.BNJxdrbGO+tf+Fhs9Q9K3zGKRpqNDHChbS5
vQd2AR2YOuoDefKrJqTOkONn05djN9d.ccutTGYWLWUgAtSIGm.tpOdK08Ps
+5ppszkaungexhF9NLCAWmU.8bUUn6cnpbx.cM5Z+z4xU2X2UfRuHE3qEw6E
o.oKVf5SgPSYnxv0KBAT2L33aPcukMq3gqkTzmFDH9ZvhymHoJ0QO49eNye+
U8kritlYF0a1Q30LpVuIEfqH2p1MHpBqnw1XNUkV9ljVVuEVVlGMeaobRs04
k2UQen0woyCiUjCZO4xZgcQubP3dbDYshrtFlHq9CEdrpzOSyiUxPkFqU1SS
SiULxRiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKM
VszX0RiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKMVszX0RiUKM
VszX0RiUKMVszX0Ri0qgjmZeRJiHtF8jTNX.cXQWcjrZXU7wcD1uHM4iz3On
70tO7K4V+3fQ9dA2z62.N2KYlbWj5n3EXJptBe1ufCxogK247izj0wzBT0Ao
dQ3lL102DVU08PPkz8Gc7WDqZgkoZfefGC9weaADtldB.lSyh4x7sfSHrfvz
DOcNOu0uKF4o5QMe6pUz78NTNKnwwoeaEZZXzp6AkBjzDl3ZpCG5YcBSqhSC
KqcZlOr8hjcuLsSj6yNrDmOyE6b.SQ2U7ZIEf7M1Yl9SOb8M994QES1zuedf
tCofMH4e7yaNViruTUnFS8+eGH4IDpQyA7cdkMyLZdlCKQ6MQkTSL9eUtixw
+Qtndb7+YO8zmpwOjb5+eKatLzkNupR3DV+cE0M0gsJSSSEACheLHF8OWFtX
2kiP6QDK.fbbch60oes79Ex0vudghR9ic20HPyDqyg4dc20o4qHZcBShdLt8
hnFeDFu69cwc8p8lDyDucstOGbw8zbi4kP0wq0hBvNccb8puFKcs2y0VC2SL
JZ2RtZzR7WgdG1lrS13KBPDlwSDj1aFZ+U2qrA0Q1fF.EP9ZzRyLPCoiFcjw
+HzlHCyI2fm.rXqz4Wr+9atQG2tjh00w3vMUauSEtDp8N0swdm1gBAIxWCfJ
mIR8WSblRkPZnRhkruSecu.RMecxLIEvMfutNc3qu778pGn9NfdA3tc.g8uC
XyMXQSGPSIf5D5r4Nx0AVhfP46NvCWcmV4Y5z40.dSAZzNDCzN5DeFaBEh.z
okLgJQzng7MT6.0ncf26n05nPXnIZIchLP.lH6HcFw.4YhVRG+t.SzPZzNMC
rYnvk51vPSOrOJP2fGmIEWwLLwDQbZWIq5EWYZTRKgk+N5SWg0Ge3JiirZMM
ErIRPWmwZglHrLRmvXHSLW.DV2fK2a.SjVgwLQ.SDRiQaDszcqSZMUJSnR.c
6Qd2sjtCf1ZBucyV0SlDibNVHe0L0kqKH+JiGMSGnCcCZjolQnVqvPvCZZWG
MimlryrwRKczIQEuQO5Dn5nSepSO4o59Tm53SbJAMc55jl5k+9k+ADKZmhC
-----------end_max5_patcher-----------

Would it be possible to just nab whatever fluid.loudness~ is doing? It seems to work quite well. (and perhaps retrofitting descriptors~ with it too! (some odd values being returned by descriptors~ in this thread))

That is pretty nice.
I guess the fact that it doesn’t need to (potentially) resize a buffer also eliminates the latency/slop present(ly) in the fluid.verse~.

In thinking on this further, I should probably compensate for the other compensations anyways (i.e. if I alter the Pitch/speed of the sample, to make sure I compensate the spectrum based on the outcome of that process). Is something like that possible in the fl.verrse~? As in, fl.read~-ing something at a “rate” other than 1.0, so as to “transpose” the material as it goes into fl.land~. Or more plainly, read-ing from samples 0 to 1781 in the time of 1000 samples instead, ala the messages for play~.

I haven’t looked at the code, but as far as I’ve understood what fluid.loudness~ is doing it’s not quite that simple, because of the way that code is working *I’d have to check to be sure of that) - the code also pulls in a whole library (Eigen) that I don’t really want to pull into the frame lib repo and manages memory in an inappropriate manner for frame lib purposes.

You aren’t writing to buffers at all, but also the entire point of the system is sub-sample accuracy - there is no slop as long as you stay within the frame paradigm.

Sounds like you need to do that frame lib tutorials - but yes.

1 Like

Curious what direction you will go with then.

I do find the results of whatever core algorithm (ITU BS 1770?) is being used in fluid.loudness~ quite effective.

And/or if whatever you do come up with will back propagate to descriptors~ (descriptors~ funny business with loudness)

Indeed. @jamesbradbury has also kindly agreed to a brain picking session too, so that will no doubt be fruitful.

you know, my vote is always for LPC - @weefuzzy was recommending converting the coefficients to filter descriptions so to be more interpolatable. Interested?

Wow, a compliment! Rare thing… :wink:

Seriously, it is because the people who designed that algorithm have done a good job of faking perceptual model for cheap. it is a good working compromise, hence having becoming the standard in broadcast and post-loudness-war normalisation

1 Like

As in frequency/dB pairs? How would that work with a complex filter, would it just be a super long string of text? Or would it have curve info too or something?

Hehe, I’m am of the school of honey and vinegar realty.

you know, my vote is always for LPC - @weefuzzy was recommending converting the coefficients to filter descriptions so to be more interpolatable. Interested?

It’s unclear why that is your preference and how much time you’ve spent with the others. Also your description of “filter descriptions” is very vague - what do you mean, as the LPC coefficients are already the coefficients of an all pole filter?

We’d been talking about interpolation and morphing. My thought (not at all developed) was that interpolating directly between recursive filter coefficients was unlikely to bring joy, and that using pole positions + magnitudes (these are complex, right?) would work better. However, I see that some ways of doing LPC produce intermediate coefficients that are, in fact, interpolatable (via Diemo’s thesis, and a quick dip into Oppenheim and Schaefer).

Ok, had a great geek out session with @jamesbradbury this afternoon and after building something on top of his Auto Spectral Compensation we managed to get something working really nicely!

Have a play with it, and let us know your thoughts.

So a couple of questions and thoughts.

Firstly, it’s kind of slow… I guess faster than I thought it would be, but there is a marked difference between fluid.stuff~ @rodmode ENGAGED and hisstools.stuff~. I imagine(?) some of this is unavoidable since the hissstuff doesn’t have the kind of buffer-based threading that makes @blocking 2 possible.

I’m not a HISSpert, so there’s probably some improvements that can be made in the p IRprocessing to speed things up, but I put some stuff in there that seem pretty boiler plate in terms of IR processing. (I feel like I’ve accidentally learned a bunch about IR shit now!)

Alternatively, perhaps it’s possible to somehow implement the post-flucoma.stuff~ part of the patch in the FluCoMa-verse, or in the fl.universe~ (I remember @a.harker mentioning building some filter stuff for framelib which could potentially make this possible, easier, and/or faster).

Another question is the melbands vs MFCCs thing. At the moment you pick the @numbands you want (capped at 20 with the current @fftsettings) and then filters are centered on those frequency. @jamesbradbury suggested that something faster/better might be to do the same with MFCCs since they compute faster and would potentially produce more perceptually meaningful compensations. We (he) wasn’t able to find the formula in order to make that happen, and there was enough other stuff going on in the patch that it got passed by, but this could be another potential vector for improvement (though the fluid. part of the patch is plenty fast as it stands.

Another potential problem is the super fast onset detection I’m dealing with these days may overrun @blocking 2. So this puts me in kind of new territory either wrapping up the relevant fluid.bufdescriptors~ object in a poly/roundrobin situation, or doing @blocking 0 (or 1?) and managing a queue of some kind. I suspect the former would be the better way to go for latency’s sake, but it’s a thing to ask/discuss.

AAAAAND lastly one of the things that I thought would be interesting to do would be to normalize (regularize? (standardize?!)) the input material that will be compensated for. More practically: say I’m using my snare to drive this system, specifically in the context of the corpus-based sampler thing from the other thread, and I want to have a wider range of timbral inflection available to me than is possible to make with the snare drum, that it would be good to expand that timbral range so that the available range of the snare is extended out (not to 20-20k, but perhaps to a specified range). I guess would be as simple, computationally, as running the center frequencies of the melband (or MFCC) calculation through a scaling function so those points would be centred on wider frequencies. Or actually, in typing this out now, I guess a better way would be to fake formula/calculation for where the center of the frequencies are in the p centerFreq subpatch. That would retain(?) the relationship between the melbands/MFCCs. Either way, I wanted to flag this up as a point as well.

So yeah, open to thoughts!

edit:
(code updated with minphase IR-ing)


----------begin_max5_patcher----------
18174.3oc68s9jaabkueV9uBr7lptaRFMa+BnAt2u333D4sVqDei0Vt1xapo
vPhYFXggfKH3HIu0p+1u8CPP7nAP2.nA4nLpronHHH5yoOu5Se5yu+6u5Uqt
M8iQ6W47+w4mcd0q9u+pW8JwGw+fWU7ue0pGC+35jv8hu1pnecS35Ou5J4k1
d3w3sIQ4hqgJ9v3MhuY5s+xqg3JeyzC4G+pfhOcWX95Gh2d+MYQqykCC+ffq
AW4P7Ah+x83qN+c9s7+7UeE+kqzbzd6g77zsJGsv1i1xA6tvrvGixixtIZa3
sIQUGx0Iji+JxOJ+S6hjTwpaC2d+Jm+dOzIFds6UNn.AEhHGecTz4iQ62Gde
zwwedzGEOkUuFp6Lk6JynudoMhqXND6Kos.AghFIssN8wGi1l2h1d2CQN6SR
+fy97C2cmyCg61EscuS7VmGhxJYEIwaiVmdXadU59tzs42EtNpJENjvAIXUk
6de7uJuaNE1mD9sGtsP.BV412xDuD+xeWTxSQ4wqCW0M2D44wYit99Wi8fXD
MP9GW+qXOerPAALRl61nOvHtV71MQ2EkoqZCweNkcPPDmhnTgFAVP5iV1oCx
K24Vma0l7npIOTup9WogIfijJ1m+WdSiT6RM4Omb3Ol91Pm38N2EtO+5qud9
UM7FP0PpDrOdi3BXaqv3BE9N7vBqPRCriVC4tjT1.8DAl8Xn3w3oKyAXtWkN
EszRrxSJV4QDhUP.dRxUl4Bk.WRendTAs4J+qI5C0PBkrnDpbJcdHzNLJtyY
8tC4wO1ggeEwLPbUp2it1Pxmohw0o96pz2+CYwgIqFVXGHD1kAMJk0qdOLZR
xOJXHrGRbRzSQY6iYS4mFauZEKJhJe7qpbKbt3ujJ9g7up7ih2J+HX4GkE8T
7w6GW9ogYrQdNaXeHSRXez6nDD+mIcST11CwheI4GxlOKFRhYNNCY+tBCyhI
3iW9Duf5Jbg3Wn9Kr9Q8ImXFLIi6SRW+9nMUDRYSHr.mh2tKKZOyARXdwXu7
xrfABOjjeSsIYVvqAtPeufi+Q029niDk+TJmhe0p6yh2jtkOjpMuv+3iO7eV
5aQ75IRS7M1FtSwMyDVYLoNt3dFIeX+sgY7osB8WzwKlmllT+Rk2WRzc4EWd
W71sM3o4o659hYw2+PO26sorK9Xe+1hqr+lCakW8FlDR9M6CepN2NOLIoPYu
9O+GC2FybiEw01EjKn7hRaXOrecVZRRM5UdkmTbkMLI90QeHdS9ChGz0UluY
e83cGEoVUNKuI99n840+r7v62W+S1m+IISuxGc31BM5axidbWBiJp+Epsh1p
puUMKV6yaXdTZdpT2rCeAsVoaiancjMcYACKrlCKLs6d70RAagIfhf63Os3s
LeMOElvWoyi64w0kEsKMKOZS0E9HGea2D8wJ1TJbUTXdYj7mZtOp6B4VGno7
MT0aPKKLc5XQCeq86eoqYHHfJMkJlaDuGAO5709bUla40bq1lxZw1l0V2u8j
3sPfPKP5.aIYtulYtpSFKRMik7bfwVXVgHLqfQhTvrf70QXJv8Yfo.4ZpdtY
Iv64f.KgxkQsqg.AmpStGPM2itZtD2519Ggpo2e9OpydVzk6cXQuw9sbB2to
HB.dxOkwFnLH.z4lQ5aSFoTyzT9XHmqUvH6k4oJBpSq8fmJsNB5TLT4WWMWc
e5gr0GIzBljS8gMKH573skqK6mKsV5nqxgoiApliAjEGCdZNFXNicfVZL3p4
Xvyh7AhliAnEGCXClKr0X.o4X.24Xn3COlXkU70Ku4FYtAtILOOK91C4R03p
YJxn0vpWNRtOI81vjh0wV5jTwBg+pSjvLsc.e2+5O9i77GHV3He6yrwFBfOa
6UV..yihnH0+PDZR49uKlH9ZmvM+xg84NruAeWGEBgNgOJXdp3l3ovM8UwMQ
CwMMl2Urk6Hew90Bk6ahObl4cnqc1kD9Im8oOF47exbvt6P9+4p4mo4sLLs.
WISyStYKXfUXZvqc1GkvdnNR6hN4oLd25zL9.wFbOxxv8PAWSYxZDOrM4dfq
cXqOYiHjuGiVME9BdgjpPBNADJ4KAh+EFNyUGxQlht62CZV2neeWYlefh084
5akM5+g38G2.HMmhQjUlumrZQnx+xi1ZKpNl3d1O1+q+B+mq1v1Y0+W9K+u9
+weMZ6F4mLJtzAl5wgijWbdziEqYY01z38Q7e3q3u7T7s7vf965xwFwNbi6h
aFy0e0goJTIbcIx85xFBO+dGsqdJXfgZFbxTCxKf1tjelX4T0AwdeXdjCx.J
1e1USjEsAwSlO3.aLktyQHa+cw45ZN.5YHctO99s7bHnwt5CoRRVFokG7ej2
6ZYECVj8OOBnrFPsvdWitF7xtU+xtU+EwtU2ytEvWl0mkF7lztxpzvmQF+5b
Op.hUZVX4ugE+EXOpNb2cQYErH4quNDdcX7cy3t+iFdeSzmcU3hPZqjfVZFV
tLi4k0Nq9as2XYPhmm1LHnL6OPfz8gcDnF0Ve3gG4denKMK8XhKesyM9v50G
x3peFOxnKfFYFXvH7ybNf6n4.Ex.SjEfVps3xS28Sv0lapg3GGpyt63Z6Qw4
du1zcuU7Hm0MWYA11j5U6+SgmdLrO91SYQx7yA.r2rjb7FX+FwOxF.UCLkOB
O9gcUa0S6DCPPEIXT3wzEnLCUaNMM1yD5SgIGhRuq8BPOQ0GGckF0pbMF6+d
0r7ZeMFWJmsLr1LvZeqGYLtZLMU+FEVPOI8W4qr+gzr7lCmuppn+nDx5H4DO
E8wcYN+l6fN+N1qHmud+5vjvL95q0OuLnY8rXIOSRX4ecrDUm4bxzaVnUoHc
7K9P7lM0Vc7rcbKfthElf8sWlo247u921kktNZ+9XCncj2p4lVocmpQ+f+QN
kT9EGbLh7P54JYStujRpWRI0KojZZYbIN6Zlp9tGB2GMwiLf0R1BxGJa8.RM
EDzJISn9VyVmYUxgpxsXue+ioo4OvDoMrr0c6tt0qDgzTROgw07KJPtanTIS
N.tzYzJNSvV+rwmsBz7yKmgxSufehkl2coVgcVuLKpyO+1zs+uycd+1zO37.
6+e7v5GbRuygug1NqC25bKSB9QVbOrkS3jl4jE8H+sU+opUCKjFLiF0qg9SW
cVA7mpciAR6Ru0vQmYrUJQCgvq8v9dTnOUr2sxOE3sjot8VGySqMBORasG6A
BJNX.JOv9BSsHZUtjkjd6yhKKZ0jO4beX7VmeCzTyqPH8hy9pL.dhWPUFq+h
uuAatMOMzXgOn+EG+TJnxXkU4mjE2q0+zXN0ZvxhTYF4mywA+ofoxBzpBSs3
DqsjZ+70wrmGfUdVLyC2FG1cxsEXJi1y8BUtE4Wy.KDGr7gaIXxe1bGQf4mm
lDuelDcQjZNt.mqMxthrKzbys3EYcU9E4X1ulnHDs7hhbV01zrGMWZDdYF8e
gVdcCoTvhGFEmoJyZ8UNblbdZUIypqlM8t6bdME3.XBDl6OCZq8TufQxXZUi
ZOX4CHsHCwUW0O68r+yXlkcYUMVfCrYaaaITmCeJJiwG+ryWKYUxSiCKPIiM
E5Cr4AUsfiw7RTki4aG0T9F0cH13x0o1xk4+Fx.jpvWsV4rDHZKlMEnrjO0Q
UKOPDw9xGt9WK2GFeJ431w77s1VfnwWbKE7ClD.hRwDLSf.v9CAMuLD6bXtA
5VoK17ny5o64XVDls8J0EcOR29VcTn6ApFayJtAqaI2HhxwZCCgory9wKWjl
QMEPcs93.p0rB0piCf1RGA1bbb7WWiwguUGG9ZKefs53fpM+vtiCsKXOqpt.
gZyNrosT3zcqbx4uXGy6v6+oEieXSb5OJJ6gad6oiTYkBzP8P+16uKNIYcZR
ZVkuPkuAaAMEQKtR9stpxkJuuelsnFT.goVvnmqwPLE4IdG6MttMrfUbevi2
HwkD.P7uNwCQIth24ivtX96.JtUzomI.FHeRf.e.Q9N1GwVmOr4sxB0snTPn
fp4D4U7E0x6VQGqKlqwA0tuC4o2mEtItHBNP40JmuNULOxp0i8MaWnC7.WYS
DwU+MTIsUNo98Gptcd8OQJOL9LJn1bBEA7BDyIPOJRxO8A.HoE6QrtUw8dS7
VdAREUxiwAHnfGiJmnPTeBtMOlINU6wG.HPZ.+F7CbITp3cDT.ULG650HF4J
2Ig5BwhuEJ.ytY4iGxnFUOT8kgKmG6QL1.Qp5Bx9khu9Tfquu7cJ4TMEj8bA
x4IO9enx2I+0VD43pKtd8Z1WnFOAym4ELBxwwIWwlnXxfIF9Xyam5yHIIeA.
88kui8KgPsu+poXjYk7utKZqyOFtcuyOF8X7soIaVU0boET5daXdttJcUK.f
etQXZUyAK+7PTOOAVXf+C+g7aD+L.cG9qShBypLSIVVKSqkoo5JEFYxwTrA1
JD2+wWFz3fToR06fsV+b0azk6pQZAgPABcUtpJ9KTaCFcqV13PCoZTC1sBaG
5aYqotubCFrrVyO8t+r9wJUivfdXl3mv2Jk3EDT7NPv.huPdzQRGfbYVg+T5
w3jZbikAdVWLjGfkvYNDAc8jVl4RFheqfKSE.88gbwEjW2x+9CK+6BndhgLv
yECkxKroMjl9NIdPHPFRb.xiHXCtAPl9+f5Oe2m1jkdez12IlesqZjHcrwq0
UUZVbf3iCnRig3fBGB7OxEOfBHovWgp2omB3.ixIujJn4j3jTZZxVKh2u86l
j5lNZTACqPYxzWCMh2DsM5ovERW3aphdKCGKVqvv7KmAAEuCZ8XHKF5easc1
+Yz.+Mgwa+7HF4LwyRewse2xM72+gXl8FcIfVJGvB6QmdYQG2nmcC7+s8Iwa
pbfNGURVLwfTCWX85HY.9yPANLznZI3uee0Jo2T6HcwWTQsdstgkf7daXdV7
GWmmkLST4hLn4Gj3OOxE8LnYxmCRk+kzMUa.QF3kvfXiFHvlKWliYlDGvb1h
Lhqen7GgM71AtrfC+eHdctY77KVYmefeBiyeVF43OtNcWzXsJZRD.MVc+wT6
Ef4+Yok8dW3siRQ2DBVkz5f1QWDhO5i42NoEo0cDYJV254w336RumuBcqrjn
AljwTOBEJuKBFJRAAoXKcWBR+e+QC1H7KfEi7SgOEcW8p+etWNB3Z2tMFcdW
B7lvr2+5s7tnvqEIcSWlf5LzQJMqPK2y5xcu1WvMrPZxgCH5asb1YsTjqNmc
koucDaQkJSiCtidVUx6WJ59D.Pk5x2F+7nwtwr8t6I.sRY8osgq0arW5q0eT
+rUUn4p7b6cGMuMIhEtgrfF9lzz2ux5h1wae+3k5NsUkd.t1b020TsVsyHOF
iG3WF4CVb2CuyNFXNYLOttTQtp1qVXicLabdF7pX4sOskiCMmvTUWA5cmJSV
XO2pUUGeubc9+DuQg8bHvzDd3XlsDol4KDDPJpduf.rOs3cTeMWnnWYPatkN
NNpFXe5+wvO5UoSrs.6pcio3lwqqPOvu9pnoE53KCyowoUyjLHfvtnf5QDvM
5uXyqsNjq1YtcVWVgeYIT09cC3Ef5yqn5qT9tyT.UyYMV2VS0bIhlGjPSS7c
k5XewV6h77G+MIGhpdfpMb2W4UrOsnV1NYvMXwLyVPDYoeX6jnhyqyBIU7G+
T3zHB.JvUVlWTJFij53HHKT7kiHdSVTzDoBwrPYNsgd7P5WNB3sLK6ayCmDI
3S.ddxLx6AXDfXJwK.F3tbzweKZyjnAZ45Dfkq.GT34cong+injjzOnOYztD
icC..+AiCB4JqtRpOzWrHI184RbWbBE8kLgJ1p02jlLQwxxr74xha0UVTrUC
ovpDwtCY6RldfezxSs.A5xruILTyMy4NX9Mv.BPF7KxE3EHTPQ9tdH+kf9yh
VGE+j9U.gJYvxzxbh1AUqpe6R.xkQyECG4xRGT.ryDLQX9DBJ7ISKNQaLkuf
Ew679nsa1+bzq7oIL8saz3vBQg.pbixIdffhSRHE5pUxhNuFbxC2YhOgJIL9
6CySc9ddVXVY8w397n6NjjjazFF27Lw365Bk61lGlhkmZTOlkAugNSWDHaIH
hEfTtbSdV5n9KyDjj3mDsi7o9x3EwkZXXT.Nvepz9EcNxx4M88mimWxOvyB6
ml1dsC3ybhbofKlvX1ZJ1LSsOzjFbB4TuwEvf.fb8ILMMRQAT4A.XX6yCVc1
L1q+CLw2Fmk+Im+z8oyh4muPPjoNwOEAlU+MhNe4dk3mBnM9oD.V0KPsqDa0
J5N0Rf6VBJHufRublfD1sIDzKPhxKPhxKPhxqFUiqjC+U7cGw7N1qOzdXJpr
UmRDpDzEueFyqiBi6Ju9isqLV.ZwC1WFAU3IX+klmvFHoYa9rS8ZLoAqA2Aq
waQXMxFjK08b09q4rFN3+BLVzgtHs95BfpUJ6.AKNrALdSMTaapo.xlWdSMh
nHM1ViWvRnPcDGqImKaMBlioFa77WDdiqniwu7XYxQiMBdynr13sjVafAXon
T+NrrS2uU2lKpumEaOf9vKgQAU2QgmM6jldASeT7ERdEpWQR0PAlrbFoyzr4
+ut3tqu+bB7tP.JPf.sTQiz2OvJPPaR3mpEO4fvOqevJyPe5BS55fA0GIYBT
PxdSCqgm4YWJYNmcCVrI2pNvGb1khr2raPsI2lg4MqoD76hy0kh87rGEKAzA
u.wpg7Puj0vhrF5QjA05CdIqguj0vWxZ3qFMbddqwv5Bbhn4oVq6.BvBDbQt
3UIbtrjKP628YSAGIh+xj4PQBenKOvFx2XRlOWiQXKhm8x5iTFQlZC2EeQ77
kLYrXB1ajpOcD0vPLG4J2wjmGoDyeYRIljoXoThMJ3fxCaYsDRIJG87D7m7H
iG6mjDMB+LmCLdzupPFXhr.zhkxOcSvDwpo4RW7Dx0lvZj3GGdtQoEWcS7Hw
lo+jnKB93YSfPinKBjgsIu.6YhNB7K4jv1Qlb3qtIQ6j3XZZqNtZl9SGoLGU
XnL2EPW6jwJdsSGk8myh9uzkbInYMQyEjomLubzWRS0Koo5kzT8RZplqB4RX
fKK5l6XV3NDsc8mtYcXx5CIR0DCWoEMvZqzBiKRVEWKg1pFeUYJrYqEnCShc
YVrwsqx7XGlH61L4vlJ6xbYydGyPlMaX5D5JYYEUwCRjPGJInYCKPk8SMrgp
iczAskpo8TE1TQMuzI6pxJdqIY11xZseh9rtNnE1NrxViJ60R6fVa0vhqNVc
MwxaOVeGzBb+Vg62Rb+Vi60hbWVkUaYtCqy8Zg9MLonadmjAtpA2ntE6l1RZ
Z4t00GL4w0MiS.MuTW4KsUv4JtQ0Vs0vxcWVuK1N4hzHGzN+506rI0VFmsYc
HP8JDyHtGYI3dD49Rffx.dUjK9yJ6ar7N7Rv6PTbEd2BK50JtqFEwoCOTqJK
sbvXsZkR+kfEhkmhHoNr2xJ80rYq0eFcaEN5pVTWFKjB154uQ5vQE60PVXqM
LpSIQHsRk0PN95kff3SNru8cCIG1CiFVsWtZQIw.YB.7D1C8fKpn3v7v3sSi
GBWDChdth8tTlOIW+KKdHugpDVqoNXFSzeQbp.QxkgVjSNxkDOL24Nm6FK6y
setGZHtWY8uKeiVxiDnrTK8OlF2kzCcqcKzL+KC3+EngnDlvIXOZP26dXe6f
XGaj54S9626.Ga.gvoZ.Ldqdxbv.ew11WDW8EUPg+Zhy8YoG1MVlXvT0gqsw
K5H5JiqwEeIYEL5i6xb9m+M2Ac9cN+l6P+VmeO6uv8xSwcySQnEIPaHQXCzs
vTHBbQ4aVxRYuJXq+KLS0H1DODP7+sNu1Adsyukwqo.v0i0ZJBErHb4BwVhm
j85cIwkO7qwNvwaA0e.NHVqUyb0o+VaKpxHhbkmbVh2kUDQwNwiNfR+IZNky
AMmQVDNTf2kjqo+o+EmAzt6QzDgAST6V+XJK7u6VrQwnKIow+oWOAlnOZw3g
EwkWDijO5hy6do+m.elimjz6+m4Nl9W3dfXt6gW+aGsJOXQRpKvsZNwgv+wg
AuH44.5CGA+s9tD1prKay1UUZYJX9sJwr.2lkXVOkYlHxHmwJYL1gnnRQgZN
DCbOWiPj1LQ+ywPz2f4Y+fy0HT2oYH7bLBwlvCOKyxHSzl4QBUspQWlgHvDl
HRoLwiwa1kxhjsvlHAJVIEAQkEhorYygnWu3reCHM5YP7fZBqWsvdZ1FYgMg
tXG4hMApugN3BdnC6enCWzgt2kt8NWSsk.FxVBpnGdBjoQrx+5LPZPiBo.MD
sgITwxQ8Jh32u7esvzFwjoMvYPtxDG8miHQjttAFIdrzN5KWrfdtCOGlOJCE
+xcoEPnwQzs3CQ.5RWetK+pWNZzlL9b0wQFL.H1OaYQSU3HS7uLHwCh5PcfL
Obp3nOrIN8GEEj7MusFDuWsfp6muzAv709a1GltVrO00vJOBDJw4XNz4JQMO
N.G5pvIaSz8qB9wUh+sDNB8gaCWxmt8QgyqhauSr5SJf0Gd8Iu+NwruVy20q
j+dab7RYrlMO9gTGJEN99CqCGi.g596OEA7j8lenGEImG7A.HQIKs6V7OpDe
NOgB8H0.Zbg3YCzOg.oRLOIvkTf5LDT.0UhY5JJdhpPsI0EhKvfUreAZr5BY
TVWOby0MTAdkpTOLTDsI7WpMrPqRAQebVXYzOZv1UAKicie5pl3TANHTeFoJ
4Y.nuu7creMDR8uQC.f3utKp.tx+wnGiuki3RMMquPJ1uMLOeLJ18f4HkWuK
bGYQIve3Ojei3mELFxrI3sW.evALqEtRgdlNCEancq9.2V0FpNhIZseGTYQd
U8lK.NEtEsiv0DnJRp9OH1oL91WXCUswsvVSMJAmUSr91zNj7.wclzL+o28m
GWLl0QoGObAF6BoDuffh2ABzP0.xilT5rmqOHhefdLtRE2rZbBBwCJUh7aHn
qmzyBWBC0BmftrUvLyu3Eefx8qe4qm9kKf5QjH+jKVBPnP1zLxfXEHdPHPtr
i.jGo.u7f9J.hLU5ne2m1jkdez12IjENOpphc7Od8XTWmMmf93.IRfwdSgCM
9G4h0PQ+Hxgq5c5qnqwHdVW9Kbbj9jULax1KViU62MKp0ln0FnmRqoS2Mz3d
Sz1nmBOy5Zeihirllwr1JbU+RI.Pw6fms3wKHuuswIw+KJh6Mgwa+7DoNlpQ
YLIse24mD2+gXlMxwPjsTXgE1SO8xEAsg9hj392jfF77kLOSM11vs9fNUGfW
pS.XCMBOmyGeezl4wNXe7Pk3aaqa5bxFdaXdV7GWmmkXAtwYkv3mS7OOCKzc
P2AO20D9Koah1OYulFFupFAX97iQNdS7CXZ9rRUGd714yuU6fGu.HweHdc93
m6d1Im9C7t.V9WrqB3GWmtKZNr7aZDVMx9zwzdGf4+4RQV+cg2NYCTlxXTog
Ln+hyJSJ5i42NaIBn+HmUjGkKKG.uK8ddlkr9xp0PnAS8HTn7NIXnHkZjhxI
4bxh92ebjEtyE7BV+ovmhtKM6wOuLKYEbsa+FTuLSKylvr2+5s7d43qEIudL
LK0Y8lTZVjVViMkUaiufqs.awEb.UOqmGbqu8V8mG7xsQYjamsJy6CVY.mEI
4eonGYBZ1HqVhGIZNJRjd2IUf1a2zos1u0aVtsdxLJ4KJUtlYFvcvpo31jHV
nZxB65aRSe+pylJzIrdchRxmJQBO.25R02oxLiZGtdrIMfeYzjXwufd65qgl
4F6isKUvqp85BroulO1OidHW3R3nkSPClfUU6T5e2JSfdO29YQs+8xbG8S7t
B+WJKBHgGR63WBbybnCBHEUpcP.1mV7NpuAILvqL3W2RGgGU4Ne7oGC+nWi1
1+BWgNMDYTsNJE5f90y7Bsvty4kQ1Dd.GY1oPXWTP8Hl3NyN6xIJ6E21WVwZ
KIzurzWa+NM75Q84mFnqT9tKffTs44CRsUioIcopWnN1MepxY25rutTYuN5a
RND0ryCMxJCgeZ1nE0t7ImJAmcWIEDZV5G1NaT5koSSIk9G+T37Qn.TfqrDe
oTLFIsEgfrkQc9Iz2jEEMiTpX1rbOkfd7kpc9Ix2x7rsMOb1HSeBvyStqYd.
FQJlZ8BfAtmeZ8uEsY1nSZ4ZEgkY5ATDAy4lN+OhRRR+v3H01GqF2..vWqXS
QtxJ9m5C8EKnlcutD2KFFB5EFBuo+caT1aRSlQUgxrg6xVWhq7PeTMjtyBgt
6P1tj4MncZ4oIj.cY1uENq3lwc0J2bX.AHWfCxE3EHLdf7c8P9mS9TVz5n3m
FWkjoRluLsim3QfpmvtyCQJS0CWreFRKxfB78ljUBy+XPQbNzhSQOynPvYMh
m8Qsf+iubhz4zj+3r403vESg.pr.gHdffhtf.E5pchTuLMXlGtar9GqroNee
Xdpy2yyB4pyFcrOO5tCII4it.XZdlY8ccgxcx2CSwxNngGyplmNmmbBjsrUw
hVKS8AOS3T+y6jsjIMa7HjO0WF2OtTyGiBvA9yAO5Yadly4vf4Wx8KhOv28j
OMe0ZDfKIHxoHtP.fYurnvKLpoQX3I8W8FZBCB.x0vxz1IEELqG.fgpOq50m
VvdCe3I+13r7O47mtO0JlKq7aV8GbEGmY2biDucuILOOK91C4xVekhYqwg0q
2mjdaXRQohTJuzAbv9UsSHa46NIGNiHv8ul3jEcemHsMRMRaiwciz1ndQZ6q
z.ssck6FPweAT.mGy.Oo4l0nEBiiGKBi2BmF6ltIftwhqtvgKEXv0LvhZkR9
N6w90.kVX27HfNL.DFM2bfxeg1MU+SLEUMwuJrl1s32Vc5xN5bebsk59tZ31
mEWElYb2OH.VzJR.f.T.ESAAL4+h5vmcUJyS..5KacTPs0HLkxvFQYVaTf0b
TPfcNJJ9viF8GxfewvoSC8pLxOfA9lF2kCNwqRlj3YVQiTNF5w.9Ii26aBgu
JUPqY.6H9rs5g3MapAs7pUUUol5QEJn9XIRVU27rgT1Q04ljFuvj0lnfqLkD
ntRrMRBUORCNHvLSC2lIV+mtTAvXpvOfTkJBlDUzgL1NmaSh2sWIUfaSEHpZ
p3HA2xy39362JZlT8LYIISrzyXPEn9q58Dk0TK9t3jHdrvEZwG8WsJb2tJeb
M6PLVxuHML6eU4GEuU9QkN7VkE8T7w6uDUyVElsluJf04Gxj1.9n2IDZe0io
aXlGNDWwGUYrnxCs.21w9cEq1YUkMXeUEWjRLHVhsT9DI1XSoUbRxVQZR552
GsopC2Uo6h1FucG+nysMuz.Z4kKVoxMUCbmmieUW+35wTdwS8E1rJspiU2mE
uIcKePTalf+wUV9lqLtupDi3arMbmhaVZEuiKtWzQZuMLiOQUf01nRSxooI0
uT48kDcWdwk2EucaCtXd5ttunPau6KeaJ6hO12us3J6u4vV4UugISjeC2iU8
uWXRRgtZ8e9OFtM9wv7n7X4T.BTdQIdi+.yoVZRRM5UdkmTbkMLY70QeHdS9
CxZJox7sAdGO496zTSyEusZ+gaKzguIO5wcILpn9WfQccE11jWBz9mt6yLMJ
.fuD6Ni1EqNZWutC1kz2BBJL6cUuuanELT.uTXI7R4CubVnjqMWmDFW.NbSY
YBnkY80+tOa5Zqgij0oqLSfLfMBRF5PaHdbFXHsKUvSbDdJi3palxWPijunq
3DDKwICjUzh5QDgujHikRFaBXNYiQOUMjPZA5ijQfsz7lsow66g4zUJHrrJj
bMOPI6fr3LkpNrbM0gE8b5vhHCdGicsnCqd3boai1klD8YdrQNe2uZpRmmmc
ErnRH5wWXHhMAuzrGycVQBVDNRAjN+7wYkKwVdqfPgoXnDYbel3sxagbWAkv
ZKzWHu7bwckmqcUhHRlhL9lk2c0HrpXaFhm2wMZ34ULvid+mzXumDYykC5xO
iBBFrLlUHAB4EH8YUTvHpk0hvRtBxlgAOprO.8r61zVYiOFa5GvmadDBXSdT
QTJTxy68xFgG8dYCkxGDnDP1tz2LaulPIZmfMnE2wWnla3qmEGCtZNFPVbLP
zbL.s4tuavX.Zow.R2xPvh7AZqZ23LnX34oqToUGE5paPBr4n.axnvVhlt5p
i5YyYDhtEpimMMYRzUtfZS6UZWyR.aNJ.5Jb5ZS6lTSFE1hWfzkWbTWxNwTn
qoSbPOUQVs8ttiPtz.RbUTQ3UF6czqKpVAxc2JnFKz2NAXucBsAptamE82JK
5oMVTshou5qFtdwaWq3pD25.Ja6ehbpvW6r.csSA1ZGMj0ZjLrp9zx36RJS.
1GGOzzZE43JryIACsSEBZMB9YshRWcXlsektdNpP8dLgrx.WE7w1+verPF63
5sRS.pXGMLw9EgsAitUKabnenecZv95PP9pUzZpAsqCEqzHgy0QCkqSGFWub
T.L.xVuzBxqa4e+gk+0GVVmJjrpIbrZE0nVvtZ+pRyhCD8wZzQiEGi.dUmik
TMF3TcJJMiFVpLRcSGMpfgUnLY5aH3R0l5BMgE0AhEyTbBxlC85Pd5ynAdC3
LU6QtAXkgUG9Mgpz9I.iPvyEXbid1MvaAwniIIKlXPx.HEUePQZZ3olM4u0f
LTSsizEewLHB0ljmJn.cRT4hLna.ymFsnGCfjpKWoxFv2oAdILH1nABr4xk4
XlIQMQgMqNha.2llaCePH1zlCeUPoY+jvEqrSSXx7YTjiMg.SirJZRD.FC4k
1jpqAskFnnaBAOInrzpDuBHqzLI1tiHyHHpzpDYitL2btjnAlj0A5IsIo2.h
ImzT6RLdU.ejy8xQZ.0IWRKAtaXgrelvr.EjyTZxMEXqlsb1YsTjqNmcSAhG
mD7NZEIOkv3nM94QiciYMAbCmHDMNqou1.HY74ppPuPunIvtnkDsqAuhlJ0Y
.jJNI3TbBPo3XfhvwAghyYsxoId9s7dUr71mNRXQb7Ph3ngCQqnNpF1CubCL
UIjFZV9B0GFCmVqk1JzeKPGy56pc+PS3XgkPqwbZbL.MICBZB4fVan25rRam
41YcYEl.efS.5.Wn.plyZrtslp4RDMOulll36Af.PqHIqFp+Lb2WM.d+rIQz
DF+LlJNuNKTCQeFSDZCKeVjHZA+dlSEZ.DMVj.T.sdFSBZCmdVjNZ.adFSCZ
CUdVjFZCIdCWT8Cf5aS.w2rOgh9RlPUBgclKVpKJLYEhnI7zMx.+L.R5FMbz
YE5uMryYtsQcgZN6P.pfTNiVVpAvH2HgPNqP3MfJtmOdkUCCbFDfsAP+1kmA
mZv61v9DFBR2rzXrCnayryDi9v01HgpMqR7Sh1M.F1FMDrcAlir5vr1ynyKY
S3SaL60tAPl1b.WZSGpzF.lzzAhzF+jwWHHiSsDhOHFq.Kg+FFyhMdxixtQh
.BUQZEMQtjZMBsdvsDTPQSr83qiBdVLjPgKIg564OeDZm3Py5rCaW+fr.S2q
KiHvP3noW5DRksjYF4J.gkWPhliHQimDadH9fWPhlWPhlWPhlWMp975SN7b5
DVGBx0pQURw1qw.KUyE+Ecwa8s6b1EE89axSuIIdu48uSfs4KxdqseKOAp7F
zb2F6vqPWdFZb6p7PzgWht8TLr2ht7XzrbRFxyQCuGTDR5vP3JkBoxlkJp4d
XpxEhFtQzwUxftSzzkhB2JnlW5jqEAgRaRlsctT6mnOGLC5joCGM0nxdc1Ln
CGMb5niiGSb9ziCnAcB0uin9cF0uCodcJ0kiI0Nm5vAUuNodCSJ5l2IYfqZv
Mp6zposjlVpac8grXW2pcbyqzU2buoAaWWE2oZa1psaGyKYAkfZdCL7QTROd
ztvUj5U6vq5GE3mUd2ul3beV5gcilEB5mEhFhE1Bit6mGhj+kqBv747wDycf
8x+fcy+PnEUDDhKg4mKG12geMl4oDLVQPHseVHdHVnHiCWc5uMikJSCQQnYW
JrTdXre14Whyu8vcW+XThHL+q49s22KaF2CalLQI06RRCMRVkJWyuKYQ4rMw
2f1LIPOpy.3D4RFvfncC2AEa0fx98ubL2pm+aQVZK3PvLSjfArQBz14QABlZ
QVV8.saAYBs4jp5vvJ3msaI3sZC1GCGTUayuQuv1n45QOBAFLBESxK9PDgLg
IRNGiP.zfgnq6YXHBaAZA8MBUKT7X7lcoL+tEJKAR3gRBpIxzeW48HYBSwBr
NAIya5xSwZKYiNWyIHSDrQK8HjXhbMXPdXkKV6bGMvNM1LKYiZ4z8uyip18w
lk2tMSpYXd5laMMWlA1MSlHIlrRtf.QbjcQwKA4BddCPUiGepjzOFRmaFfUf
mpfKAj.RWfmQrqCVDVMzcbXST3QWnYhh6AUM9hnBTh90Mgq+rx5Q.onvL.cT
QBfdJuBg1oOUrISxrZPbm4pqHKZWz1MNru6cYQ+WZWlI.u4r9JbckQVBEfPZ
PPcWQyLkFu0LJkNmTJATiR8rIk1XOk0fT8mSREgCpPpPHZZzZ09K2pmByZbb
H9YxeWe5D2WQRAUxCPcxCtRiBkpP.GKJWJWPqxGRZBrz1WOVAeJL4PT5csKa
nSjxwA2oxB5z0RR2dembtZey3sw4wgIsYLM9VJJgEE+LGKuF.nhyiJes8Ojl
k2bfg+6q9ppNOFkY5AEbbMPvgrzBNE1KtLEbbWNAGSDaPKhXimAhMtKsXSgs
2KSwFuESrAYfTCbVjZT6Q9IyiuBMqwWICzvWhe0PaDzwSlGXEbVCrhTgDkda
meRzzHp7wyZ.UT5IRrYE4MWEa8sGt6ttJyZfBJDY7pZ7PE1iDKqw08ejqkZr
PnUt6pDohIl59RoT+RoT+EXoT+sRIKm2F9QG5hTW0RiYe1IN658Olll+PzlZ
0GjVoZkzS5nQ8kNZYUVbkQ4kFIqGHHxcoK35S7pQvhfKHKBFH9KOuyEGRYs7
3706Ceb2dGpSsxmRK1m2RJgUTQ+H7kB+6HmCBGAqqVoPYcVWQkkAw8x5TtQH
egjz6NhaLiweibjUsmd4CG0QBj6ccu5bpKcQTUlGlq3iC4X78eXaXxm1Gqel
Um0UyUPnD41CD7OzGFQDTVLJBulAAxh61m9RDzuDA8KGFwdbS2pwaVwHGSVI
K+Ndxxb9MvqpZUu2hAu1YQvV0rhLultxMSBNfi3wFCSylsqlkjQ0heuuieuU
JqEDPtaaXppihu8CtacR752+Yi4YiUPYe78aE3R8.bEnHL.nufefCrh3x3pf
GznqfmBc.WrrWkT7GWdWX5Rnfl5QH4tjCwatlGsOSZI5yNe8CLeD6X2HOwwb
Cz.mulEXdZlyqccYukYvmoEs6vNG7o+0lzOr0A6y9j8Ioen35HDv8zGH9JxO
hMQHdXIQauO+AGeeL6YvbL+.y0+CoIa3K63qSu6tSePMQRYad4fj2gMcwIib
sIEB2Woi8PYgrAYgAUUXvi2X6HxbDSBlY48iRSJ8cvK7.954RhbDRWN4oNGc
PxlWCqG4badLxTd730ifxsIf3w6UvU9i.XEPBCGX7Bx69PXbtS9CQNExpo2U
xtb9.iYl9g4iqAFOWiJK4aDTAWC3t3bMgNaMItPFWjEyGm+ktcecKyShq4Od
ll73tiX7NXU0TdSaDJ8bunLs2E9dN2h8UXiS4ZZYxZajxa+J6R4rq57TXVb5
AlvW3m167OK3kW4jjdXyVVziW4reGi9xBSb1+P3tnqbxYQ7eeT1Uheo6Ywr9
aud1LkFLZVOUdVecCJ5rW.4ef795lrRyHzEjyK40rkddXAq4WHaQjLKZHeHE
6ydkCmLRGGEGDZvR1XOXda2adQg6asN5ADK8SBCpGPEEwSxxKM3CyZvGHomS
nb+3IELPB3KiF7Ar6F7ghz0LPJarVK9.9RK93KsV7gcaqGs8XU2n8eZ6dlIj
8rnSYAWwkUYKUJ+yN4rvH1KCYkMQdLJLVbW7O5IlXMKheV7+gOkFugGSFOXi
386ODs+5lOpthNvrym7Lb5j8OFLV4NMVO9fyXmDnntta4+zHdDMXINV7E8HQ
HyyIk4J.R787gdDfGymp+EU+Y30CzwP5ocW3CVnNFRA2jRu12khATBaY+9HQ
qk8xpG1DtQ5sxYe78Osez7U3LzIazk2hcOov6SWTIyo0LFvS1X2QkT1h.bov
.ldJE46Bc4JoeQzYF3BRZed38AmgSGtuIclAZvYXDRCLXDhe4vgOgEFyzLSy
1D2y1s0U1Qv1caT7KJYHRQW0u3O7T94E7xBjMaAxtxJ1.iDQZ5AKNO5ur.4W
Vf7KKP945BjWeHiCBCGWB7tz8wbdfysQ7079gr377nsr0Bakk85M4HAwP4YO
f8W9XlkIDgBnr0WvSTrzb0hsH3g3zpSftQ7Kxj4WTDeUWxRnUUJzOi7m+XVD
SkvIzI+CoN6YBWa237etZS5AlNcwo64+bEOqLxnMbR2Fc7qw2vQA2M+CLUbm
8oNe3AlTqbSg3xwtPTgD99q343IKxIduSXhXChBcdJLIdiy5GNr88U9sROtq
R8myGxYKmOkB+xFSmDWC.WFKn9XMS+5W+Zw9usWTkDiUvG1t+80SDBiXg2cW
U0kOrtijnqS1mrSAhDP5TooIAV6.QzKoTIwH9MMpVNyrKM0NVoZttJ6WhCFL
+jDx9Cmg5SbAtbvK2CbIwQ+cNvqGcynEfmjv9X6hpiRHGxVGUfqOFPC.H.zG
g3R29WCgPP.GdGC.L5AcokuuM62wi9N5yi2hDXRSRDcRw5UULLU7uUlcvwMy
45dMJ.5QfHrKtH6YJ0rvWTsk3z2GUwsxXaEwAtSZ5CLKy.LODT1L.xMf5wX+
txBsgx9CaFI.gbQtdrIffKpVs8u+yNDB+vXMV6aAV17lhbCMg4HZfPKo5bDK
fKDBA88wPrOypmG4RSIQDb5mc.Sblx2+YzLkLz.HaEN7hfolUMlunKImOyjI
LWuyuILYLtWBVslTOWGO0FSeWRxpXYUVzllaVUOoN3YTSXG6N8pbfRZZMt45
qDo9QS95XS90k0lEFfMXit3w8v2YwkcyB8MYDh0o8dWTWxP+qIr+.ITJwk54
C4EyM6ZMCqp82q0CHMaibeefWt7FtIeE6Kb4PGc4NzwtFLsBbulWZ9dPeWL.
QwDVDVH1ZSZNs1960MuArn7FhI8b+NXj0AK5qp7Bbw6W8XhoFYFfdBpOwcUw
GgC.9D.6CEeBfE9Jy3NvEgnTWZKHsVkHjqLVOOn3DKTONPWTqf4a+8tTDgLh
kKrLrXr7yjsRH.apiD3.ZUtAt.lvP.urz7B3L.W.L.w3J9z.LzGI4R9DWBkD
35SfbzVWCwP9BGIMSLlGPHr45Vb1i7C3KmrUV.T78tTDJMaJPXXa4lBNahk.
CJWqt3fyFSQ6XREaT8.AkdZEg70f7ihJV3l2Fs8P8XhOVyE8y4t896hSRJIz
W042jsX4h0VUvVtpwkqwrPADH+XQwVH.DSQdh2wdiqqhYkh6Ed7lYLPlBJ+V
HdrkW3JdmO2YfvZXG2N5zylMsHehf.eoITL+ifJEQe0pvs2WToGTPyUnyDAy
R2klUVZLWiCZc+GxSuOKbSbwhXpo9We9tdw9HOa+r6Rc8Ivsfwl.ia9a1mBS
ovw2eXc3XDH1GkvVaGiZqMeR4h7h4SnGEImG7A.HQsVOOuJh6m2jUix1GUN2
fCPPwbCpbRFQ8IX0yMLwy5tKYtBoBUO+.lVFU7NBJfJjQb85WClPcgXw2Dwz
YCjuyEJTlU+vMW2nTNX.0CCEQqqf3WpV3SAt99x20IWroBhGyNl3djmhQ46j
+hmE8iFr8v0qYewZ7KLWZQvjHGG6biIjNl3XhvO17mf5yHUIOi452W9N1ulH
H.E+FUy8FyMwecWzVmeLb6dmeL5w3aSS1rpoY8ERw9G9C42H9YAiQ8dcRTXV
EFCTt.l.lxjqTlfIRQwFpV2dkPCoGKk0U8N30CEyrK26hTgmPAB0HtVD9evT
iM91WX83po99mcZAK6cnpalwolpoxjjelzLe+9jXVzt+DuLfGktYC0xZubln
oGC+nWi5OVWxYlrVzfUvz50QLRpMTFsAsP+77xHUrgHFKYvBigEILJnpOPdL
TDW34l7Z2HvVDYk415dE6yGs.09cZXel5yWyxUJeW229WDqhQsUioIcoZmtF
g1iPVpxJLqF3vYQyQtyzeSxgnWCGC0oJbYHkEYjv0YIgFv+H3E.glk9gsyFk
dh9bKsEhuPnz+3mBmOBEfXK3U5JihwHosHDDBwmeB8MYQQyHkJlMEGJLY9F3
w4d9Ix2x7rsMOb1HSeBvySlHEO.zSDuB0K.F3d9o0+injjzOLNRscT+tA.fu
VwrgbgToWRnuXAd7btRNuLDAh97F158msYdZ4pVcYgm5JnXXUO6mEBMSt3EN
kNt7HaFM12B78HLMifBKbzhr7wjCBNq15NweFmjPiDfPg.AgEfIdffhDYRgc
rL2mMhQ4g6FqUiJKi+6CySc9d9AgzJqk+kCNdWGb7nM2GYbm28DnzonDxPC1
Nh0E3Djmbb0sVMzRC.EkMtHSam0mf619KpQcNiHc2QeIdxxvodK0DRVZ1z5G
XyriQhhtDcg.LEWuKDv2OK2EGtb1DkD9oOKNQjts5AsZHP4uH7JjWaIp.3hq
2E9vHT4BVjdZgOndiSV1QVQsZWlyN+pYdE0pIXBQKiNla2UUsFUTsc5q3be6
GhMFZppdC7eB4UN0.vsFREHavp9j58cVQBs8rSinebbHOkbn58McawjJ.xA0
LIh4nrTS9lpRQpB2SiZ.uypOpQuXp2oOSGF95OLZUIyyeAPMqjlmtTlEYutZ
NFPVbLPt.3CbDKQqAwwhN2NiBWiz4fVZXHbsp03PgQh4u9fUTDlmIxEtDTay
yuf3TtGDzNReLoiKol4ArCyCDnsLaqyjvkzfqs0XkSDXnKmcCH9t.jGaxT.u
H9cboEULVA+sKhkZQiXk+5ZLNbs53PWGr1cT3NAQPMOuNy6H1TePcqxTXgh2
HgZY8Rbrpatxx1ewAB3scAmehv0nPyUjc2JrlNpMip4Ps6hJerET9DJl7ITH
4cW9E8W5E8T1EUy46Ue0vY7tc1tUIM2QAh2+D4TKJ7YofvmRwfO5BA2HYXU0
Uz3qpmITsniufushbb0jBLkh6dpE1sQE0sUT5daXdttJcUalp+bC+DM1k8FX
tiEF3pp579G9isRyGWs.NgJLezUW9WD1FL5Vsrwg9qX7oUs3CUo3VQq4md2e
V+XkpQXPObQI7AoDuffh2ABFP7ExiNR5.jKyJ7mROFmjpFqsrwYVULjGfkrz
qP7lEmTLjIYHSu2koBfAGPnKsf75V92eX4eW.0SlUDOWrr3ofroMjl9NIdP1
5qj0AKxiTTMIPl9+f5Oe2m1jkdez12IlesqZjXaIhWqqpzr3.wGGPOdHBJbH
v+HW7.JfGKnXUuSOEvAFkSdIUPyIwIozzjsVDue62MI0McznBFVgxjouFZDu
IZazSgKjtv2z.WwGHVrVgg4WNCBJdGz5wPVLz+1Z8wrmQC72DFu8yiXjyDOK
8E29cK2ve+GhY1azk.Zobz2YRaAF2nmcC7+MYIiNsjrXhAoFtv50Qx.7mgBb
XnQ0Rve+9nMi2NRW7EUTqWOIN1dj2aCyyh+357rjYhJWjAcTdT1mG4hdFzL4
yAox+R5ln8ixKgAwFMPfMWtLGyLIp812XwQr3.fLEa3sCbYAG9+P75by34Wr
xN+.GkpxeVF43OtNcWzXsJZRD.MVc+wT6ETdb5VRYu2Ed6nTzMgfUIsNnczE
g3i9X9sSZQZcGQVWmZxE2336RumuBcqrjnAljOdJe42EQrg3LgjhszcIH8+8
GMXivu.VLxOE9TzcoYO9Y6sbjFsliKok.uIL68udK+.k8ZQR2zkInNCcjS8U
jx8rtb2q8EbCKjlb3.h9VKmcVKE4pyYWY5aGwVToxz3f6nmUk79khi5G.T4T
iZiedzX2X1d28DfVor9z1v05M1K805Ope1pJzbUdt8til2lDwB2PVPCeSZ56
WYcQ63sue7Rcm1pRONzFgq9tlp0pcF4wX7.+xHevh6d3c1w.yIi4w0kJxU0d
0BariYiyyfWEKu8osbbn4Dlp5JPu6TYxB64Vsp5n51O2kafoI7vwLaIRMyWH
HfTT8dhCgTw6n9ZtPQs6dPVg9a0jrr9tZ2eqzarsQOqwbZbrVMICBZ1h7r1P
uUqvyNysy5xJLoc2MgVc2BEP0bVi0s0TMWhnY6qyzDeOPKqyJRxpaMcFt6qF
zN5rIQzrsyYLUbdcVntkxYLQncajyhDQq1Em4TgFsHNKR.JZEbFSBZ292rHc
72h1LIZfVtNAX4JvAEddWJZncqpa3hpef1S2DZMc1mPQeISnJ60dlKVpaiQy
JDwtCY6RldfezxSs.Gwt8k6gE2Lm6f42.CH.YvuHWfWfPAE465g7WB5OKZcT
7S5WADpjAKSKyIZGTsp9sKAnpQHZzxRMn4GNxFenUH78Qa2r+4nWY0clQCBv
1ftw3kmAmZcbwg8ILTWVzRiw84Q2cHII2nMLt4Yhw20EJ2sMOLEKO0ndLKCd
CcltHP1RPDK.ob4l7rzQ8WlIHIwOIZG4S8kwKhK0vvn.rBbWyPZ+hNGY47dn
4ywyK4G3Yg8SSau1A7YNQtTvESXLaMEalo1GZRCNgbp23BXP.Pt9DllFon.p
7..Lr84AqNaF60+Al3aiyx+jye59zYw7SwuwwefgZlqEb+NahqpZfqCz7Va1
3VkIWR7pTVQ7Lqz.1jig5Mds86Xi2rCOtIK7CGqUiZh1E48pd+XiT7gU5Ea9
tUu61XPu5luVOMdstgidk3Btqnwz4ijcsU.j2HKftjiZdFxVpmP0J8Cxnbm3
rqYytO9XY4fqrqPVk2P8VMVlP2jJkJ5xb9M5IlFRn058kmnSg.+5zsOkl7Tz
mYV2fN+ZTVpRBFpffAFRvM5wic2eGKlfgX2IQ12kjxFYmjXydLT7X7zj.cQm
jEyXxn4QY2DsM71jl5LsaMwJlsa1RhUQ9z.BWj1iHvGaH.OI5u19fMH0RLmX
6bldPBkE0EmPcoRJjb70EfN8WR5rXBcdnyNTi24rd2g73GKKG6AMUQvyiY75
cOZyrkeTTGHD0K51sUNc9qJ7H1z25cwIQ7fQJ7sdr+dtJb2tJebsfgXbweQF
6g+UkeT7V4GU1fPWkE8T7w6GW9ogYq4gcsN+Pljv9n2od15pGSYqRb6g3JcP
rxnMjUIImgreWge1UU1wmUU3EtdRyd7W8HRK+9jJQ5vBcOIc86i1Ts46tJcW
z13s630v917xVAU4kKBO7lZSxLelAtPeuxdtrpuci3BpeQkSwr3Xxh2jtkOj
pMuv+3JQIKrnye8DoI9FaC2o3lkQZ0wE2KZdT2Flwm1JzeQkgMkllT+Rk2WR
zc4EWdW71sM3o4o659hY7E118kuMkcwG662Vbk82bXq7p2vjPxugGUY8uWXR
Rgxd8e9OFtMl4DKhqsKHWP4Ek1vdfE3YZRRM5UdkmTbkMLI90QeHdS9Cxs3r
x7sAQvdJD0Zc.rFezgaKznuIO5wcILpn9WfQcc0zvzq8B2BLuzqsv2cuCFLT
GTVHKWXZ283qc1Lpi2x707TXhS7VmG26Du2IKhuAyQabXbkHq2fp6oCneqCz
T9VsdJuVVXdkYMm4132P2Fe5XFBBnRSoh4Fw6QvEDnB1cXM2psorVrsYsJP8
gwxag.gVfzA1RxbeMybkoMsexyAFagYEBVhPBhd03BxWGgo.2mAlBjqn54lk
.umCBrDpHMLV0PvnPihwhEEZgbPE1+HTM89y+Qc1yhtbuCK5M1ukS31MEQ.v
BFnH1.kAAfN2LReaxHkZllxGC4bsBFYuLO3RgMC9W.M1X5E.xAnaCdlXwlku
ts2YuuzQPAClKr0X.oKHNz4XXI1EF8xQxBrWMcjju6RNDu45aObGOqG6+ryW
K4yN+RbN6Cu9wnDlgwM6YeN+5M+3qke5WeKOHDtISj1I4WcN9w8lQzqNFXwU
CrKGPZQd+DA6RZB4dyLq6H23yNHPIC70u90oa2Gw4N2EExyx291L06tKm8UX
Bs2um4cxywi370L91cYQ+Wr.AX+Xrwg7e3B3+SdUmItSj7ebGOSy6Enw1HlC
7Vh4.Xf3uB.A1XNH24VmDcoWHrCJFMDEqCgR7jKbkLMBsqMO7wv2G4Dm43CC
PLIZlzgtYkOveN2.wBp0UNeBgt1XZcGK90HQXr62w0hzcFFELmjJFTiTAVgT
iyNrOJiY3c2Cg6ibXzmtDa.Z0LuqRGmackoJ.5YCB9WSbR3aCflRuHzJy2PT
szWkXvVWRvheg5wwKI5lwoTP5siauFbzzUPZ3pvpQCHxoE+V2GMEc1dz0gWo
E8Qi03IKFdvNDm08AE3qwSJn9bPCvRAREfkhKFKy0+o+0TGaZM0ipr.kw+nz
3I4glgGjdZR0I753uz3ez5LU6GLGDoFOHBdFdPTOcHIW0bSf8ez7x+Y9mHoD
cdzygzpdFeshzZCVmFP343eT5XBbFdNdlHxL8mDbHMP5b7jzQBgflqmzPzzr
7fzYVZFdNt53ieFbwSzxb7LPPDpFyPTu45IMHI4OGOIclkHygNKQGq5D243I
oSzktygpDQGqCnY4IA0k6MY0IcCtYpOHTfAglOsmjNVHPygIB8VRkUBn.oUr
h1HTQsdxMT+mKhVq.3fygMYjVArMGwQosQkopAB0ZwZygaFnNZfddy0SZHmz
yh.AbwB2EtXg6Bc0MwLS9IokUiiylS7QoivmMLOo0SF4YCixPsDOajdL0Y9h
D.qj4Kw+Z1YTZMZaDDzrxoFbkWygkcHTW0KzTeR.e8E5m3ShtXOIuE6IoicP
erUrYn0yFW+K8P7lM0NZDylxgVillRakObzDe3jKJVAQKVA87wJf.ncDIwWT
yCXsXEd1YdPuGNxNyCKTJ0fZQiZOeiVfACQ2ACbAFL3wnIH2E6FmgQ93nwYW
rw4Vr8YVr6yqXyypnnb5jmTqF6b9op+9vl3zeTbL6t4skPSQi1NQA2RQiC8X
g3otGS2rmcRfPY+Vm2BukcuyiXL7o50sd2EsR+qrr+aS3cHTb8109H6uzp6M
nc2WP6nmfdrL.u5q5tATTu4STU3rbx36OrNruI.086CJB3I6UGPOJRxW7A.X
8FOc2s5CTYe58DZTfZ2XyaCU5D1RFjPWgKonqSQPATILR6Ude0awtTWHtn2K
i8K5BytLq4AMeXCKq0r4zNtVD6HwD8FBbZ1uTlM4sB1jp1lpVXZsxl1C0mMz
kzN.56KeG6WAUGbcZ1PV9q6hJfOfeL5w3a4c.siNnlnBwaCyy6Sgnid2Sm8s
mIOf9g+P9MhaCz2vpInETz1rCXZItRgDlrEEqo9YWMy41JjG68eseW0ayLTN
4Yp9n121LqP1t+YVxBU1bf0wpQKD6PbhslII5e5c+4984WuqN4gK5IyPJwKH
n3cffdDwNAXGtkP3D8ne+lcChV8QJDOXAYmADAc8jV13ynnZ8Qpym.pd1aO6
AnnV9zue4SW.0ShNZdtXYCdExlFPZ3Kg3AYKgP13wQdjh9bHzuQCjqor828o
MYo2Gs8ch4r4QDu.Jy5SLexFe8wAzindPgAU9G4h6QwPS.KrCEidFYiJLcnY
jxnEnGE10psZPeR6A8Krq6zQCI12DsM5ovYVV8apzui5HFCS.pz4ZX8skGU3
KnA0aBi29YMGUZBnfy1PShA88M3zF14m4wD5hZPUCy6MYwu5pzpIF2qGZpNd
vNdt3WkXXut5gpnU8wr94ZX2Da5G0neVGPUvcdsB.VS7m87KgTAO40vpnl9g
6wg54mfG1DhFPe7rMZpf+65aOqWLeetFZMw1c0Cuy97YUba+BJZipXxtVVLz
0CkQXv9bQMkXstFJL5RHiFa0mMhpAFpqmziZO8ZiY5y1fuR6deNBmsmIkgvB
84hjpf44iZpXNGKMvy74JTyJXh34X4Fpwob0D2jwl7IjpMSPM1YI+BydZ1pm
egwh43iFuwmrjRKbEeN9oPlrYH5h.2S.yvmbJvzDiveNHh1IVfqKNfOChbk3
8stRHZhw2iFeuGI1daJdYaNldO0ZrPC.nd4rDOyacwHvo6wgQ2iBetmrZRab
397ErTKL1VubinGtZOd7BZxzUMD40J6DT2Xk8XvI6YgfqzOH0YUdZfA1yxvp
V2UZ9lKlbno5hm0iDKqsry+oTmZ00NzaVrZGYW2jt0ClTOYIq1XOsl6vgl3M
8bM.qhqzZOBWFijswLZsGfZgSzyz.rFdPq+Hb.zlblFbMv5YsGdZguyyzXrB
NNq83SKradlFe0wn4tK.vdfq3QBUwyKAfdNR.svTY8EQzAVSm7.rJdIaXvCZ
hQxiBejmLcUGGj02tgNXe7zGbMw3XsVVfl3Z7Hvz3ISPUvt3KGOHswkXMBrR
SrH97ovVh2vcaGrOLFdFd9JvRX8p4U8vO3QfcvyFQYLMoIt.OJLA9Lt99S39
6Ex4EnJd9ZxdMoIF9NU76cZX2aO316PX1qYLV4QmqCr16q9e9p++fHrZOo
-----------end_max5_patcher-----------