useUndoManager. How does it work?
-
I noticed that theres a 'useUndoManager' setting in properties. Is it possible to make an undo button on the UI for effects plugins?
-
@SteveRiggs As simple as this :)
HiseSnippet 1101.3ocsW8taaaCDmxIbsVYNncaeZ6KB8KyFq0P14OsE8CyyNICFcNwXtsnEEXELRz1DQhTUhJMFAAXOJ6QXuAaOJ6QXuAaGkjsnaccks2jALzcj2u6GOcG4w9gBGZTjHDYT9YSBnHiOGOXBWNtyXBii5dDxXWbORjjFZkpp8j.RTD0EYXr0OpTXTdaTxye+8sIdDtCMWEB8BAyg9SLelLWa+VOk44cBwk9Llu1r2uUWGAuivSDC7YKrMJf3bAYD8ThZZkvHiO6XWlTDNPRjzHjw1sEtSFLV7Nd57eAKhctGUIz.M..JU8IBOWEiUZQcFy7b6OccGg.T5mGE1JMJ7U3dLW1L84Qi6jLfUtE5wCiRKidM9zzydQzyPidamRu6hG3DxBj4in31N3tb3C0PB7IPmVoyEU5aKg6HfYvk08IWPOIDDlYQ0Cssuu0A110dREyzeLtGiSsFFycjLA2Rvi4th1RtBkPgWUGgeffC3ceqKIdwzZULuthoE7vFZUMUEnnrRyw7Q.X0UHTU4BktapXdC75TRMhJ6LEwp2KyW2qV8Hk9DO1g34cNjST88oxxHcHs.jt7GkwJyKFiybzGiwyyiZOQihmJjzy3UqYdsYYyaLsd+gFNbgikAkGMbgCqptBWlgU4w9mSCmFHlNQHMa973cJVdrSZTQahBdWNSdV.MSVuPb5pd5n1nYKVcU4qQcsIKsELsbUeXgDJ6qFTRc6roCSUlTPsaVAU6XoTvQLfikwoBMPIQG8M0Pqf4M2Ly2aELefGykFlX9svOkKNuwlXbyMw3hP66jYLTActns3pDy2AOUboje6TH9h47eenNKAjJ3bEyfAarKffKQRPFuFe390gmgem5+G2A9auy9uQFgdd2iTNA14MKgCRBCngRlpTx3H5kvIhoaiWFeDM5BoH.YXNaeDHDtjrhrMQPWoVPOv.glnd4afU16Xtxw4QqW0JhbIsKueHE1MRcL.KpmvGb.IDrwnDpfdLai1TO9GnLO90anGwEnt6pYX+mup0jbG8KshinOGnUOBG5NHb0wtoF1VuUC6VaN16ogcv0a.1KnbNGYzK0Qd3Fhrd732BzP9W2Tj0iFH8ng0nOAx2pf6RbkdhQN98eaKeRRNaYPhIo9P02WhaX1zbOy8MOv7PyGZ9HyGiJz5qPazjyjeWpwj+JXQqzOroNn0RgarGQNe+lplryF.N7dtF6TMuwiXxI5MguBMgZW3djKJcuKtOS5Ldw7szB3KrM4+27Mqk9J3iGNj5HyI613Sd451+9JPkeVDKY7Q8HxPlJg7zX+AvMbbn.S3bpWjJIsj5zsTYakrJxLfxcSD9G3IavFJYirAaLcPjOwIT7FmziGUWZ31IZ.NwSt6TY3RbfrU9ogX651He3tLuwwQEJd.v8EaSy0vl8VCa1eMr4f0vlCWCad3ZXyiVpMpqQ9CwRgeZYBnn+wI8MXXbLm.YYIYjn+k44YQH
-
@ustk So can this be used as A/B comparsion? How about using "redo button as A" and "undo button as B"?
-
@Fortune said in useUndoManager. How does it work?:
@ustk So can this be used as A/B comparsion? How about using "redo button as A" and "undo button as B"?
I don't think so, because:
- undo/redo is about one parameter change at a time
- A/B is about many changes at a time
-
@ustk Wow. Mega simple! Thanks man. Great example :)
-
@ustk said in useUndoManager. How does it work?:
@Fortune said in useUndoManager. How does it work?:
@ustk So can this be used as A/B comparsion? How about using "redo button as A" and "undo button as B"?
I don't think so, because:
- undo/redo is about one parameter change at a time
- A/B is about many changes at a time
No, it's not for one parameter. It's for all of the undo/redo enabled parameters. You can change multiple parameters with undo & redo. You can try it.
-
@Fortune For all enabled parameter of course (that's what I did in the snippet), but one by one.
If you change knob1 value, then knob2 (so two changes), you'll need to click twice UNDO to recover the previous settings. Like any undo in any software, you need to click as many times as you want to go back in time... You cannot click only one time to change all parameters at once (that's what A/B aims to) -
It does coallescate simultaneous events into one action, but using it for an A/B scheme is a nasty hack.
-
@Christoph-Hart said in useUndoManager. How does it work?:
It does coallescate simultaneous events into one action, but using it for an A/B scheme is a nasty hack.
So how would you do that? not for an A/B use, but I'm curious on how to undo/redo several parameters at once using these methods, that's counter-intuitive with general undo/redo behaviour
In my (simple) snippet, it does it one by one...
I can see a hack for A/B using undo/redo but it's nasty (certainly more than one of yours ) -
What it basically does is to run a timer that is executed every 500ms (or something like that) and coallescate undoable actions that appear in that time frame into one undoable action. Otherwise you would have to press Cmd+Z 20 times if you moved a slider.
Normally this time is short enough to not coallescate different parameter changes.
That's all done behind the scenes and is the same way the undo manager in script node and the interface designer works.
-
@Christoph-Hart Ok so that's useful for many values in one unique component (like sliderpacks), but obviously not for several components at once
-
If you think about it it still is: if you have some sort of macro button that isn't connected to the undo management system, but changes 8 parameters at the same time, you still would expect that they are being undoed with one Cmd+Z keypress.
There's literally no scenario except for when you're monkeying around on your UI where this becomes an actual problem, but solves countless edge case things - believe me, it was implemented differently and it was buggy as hell.
-
@Christoph-Hart Yeah I believe you :)
I was more thinking of the user moving parameters side than macro/behind the scene case -
@Christoph-Hart For an A/B comparison, I was thinking of using preset save/load via script, but we are hitting the validation window problem as soon as you want to overwrite the A or B preset...
Maybe an array containing all values combined with component.changed() would do it for an A/B? -
@Fortune this snippet works as a compare A and B, but is only for those parameters you assign to the function, I have 2 buttons and 2 knobs in this example and it seems to work, but storing floating tiles values like the velocity etc in an arpeggiator it will be more complicated I guess
And this is not comparing a preset from the preset manager and modified settings, but maybe it suits your purpose, I don't know.
For comparing you have to press the "SnapShot" button and then start modifying the settings.
With the Compare button" you will be able to flip between the A and BHiseSnippet 1324.3ocsX0saaaCElJIJswatXAX.6VNewfMZlibVa2.xxlicRFLZShwbVPABZ6Xjni4hDofDcSLBBPez1dS1ivdC1NThxR1VN9m05KB.4gmy4iemORcXZGHroggh.jwFmMvmhL9byNC3xdM6QXbTqCPFaZZK77IAT79XB2A2.0XfOILj5fLLV8WTKyXi0PQ+9metAwkvsooSgPmKX1zWw7XxzYaW+kLW2iHNzyXdYV8yp2xVvaJbE8AHspoExmXeM4J5ID0xVwDYr9gNLoHnijHogHi0ZHbFzom3Fd75OmExtzkpFTC0ABT7zGIbcTHVMKpYOlqS6jsdHBhR6ThX0Xh3KMOl4vFNeJg7EQFvodjkOLV4gfWsYCOq7fmQF3sVL71zric.yWlZQgsOyrEWRC5RfRPVXEuVzJ+0iLaJfUvkU8HWSOJ.FLzixuvxZK7ysrprawBEK.EhPI98j.baR.P+vpN8x+fZKCw6guHILWQkMA8gfCCJW5k7KqUpxVEKfeveS04cVZmaH409+3Lj42r6z8NKc3GPCox8UrfxkwMzHwPVSc3DePFHAa4CgjETpxHgro9r2zbSauTbIa6sw3yf5JlfCg3EpRnnKV1ipwVHF9ijwuJL5rbHnToJydXFGWRuwJUr.i6x3Tb29baISvwBdB9TvHP3V1NACaA3zsOsRwB2ESertkilAu2d3ZUhm6tTlUmjp1tTRP4J6NtkF4XoqHnLaOqcwrebbsXUWJ+JYOvzSeZkTOtazRoNoWvdCvjiGBXVEqdtBzPZ2d63UOL.2mKPR1GyU9AVKT3Rq5GvfpVJZpraZVJjIWEKbeTAcVZkpgzjJRShq6kvkkkmnVEqMhUGI5IkjXnD4FlrGd.bkK1S3v5xnNCkI4IEzwX1JAUB6DIwlHtYzaMJkt5HQIUhUaDreRcJDKEwZUm3TDh6FH7xJXmCg2GIQTi4RDMCwyxAf7xYXRNmsnRQvCIWfQmrnnCRiJSRnV3uAOpjG+06Y8IfkmiMYib2jEte5mXFdMY9GXFUQqNujQtehPROkWtRg6JrQAHWiapa2bsoClKMHWyp9dBdHGKy66cIMH4PUxBgF.FsCi0muNLri4kLKTvawYxS8o5wObKRHMwBcirtFgvRkQ8h7DcuHcbYNz.DCBx5lpVAPQXW6773wNyziF8kRAW6g5i9KrGKTN1vTqMzNkou14w8BlI2Emi++VqCHRhp8NM2B7sOMPxTkUiCnuG5aNtYuMLOfFdsT3iLd7PUMrclE8eaZ9Nn9frsYeCyQ1Kch2VuGkcUuLcn2pNZ9yzNYxzed0GyLMY4dZ6o2ljISCGX33Y4fEIKSe+rPYYs4PVkln+1OSh9v0iDIy4QgcaVXNRnXgGK7f.QBfoMVIajeTbjKpi7qHWRciB7SxNSVZ+CWjI3.6LZAt9uOQA9mpKo2JUOsT2aZ0pUQKNF1YZb0hfguJg3ia5oitEH3EoS7BK3cdBm9tD4nO9S8hWsA395Qdkk5kT7PlbP1WDu.uHzZtev57B2MMayj18xGuqjCdgai9TiW86qKZdX2tvG3SA6ZlG85k8wzK.T9UQeU2NGSjALPQYdReuNPuu1T.IbN0MTc3dE086wisTiULSGJ2IZv+B+zFqoFanMVKwHxiXGHdmc7GHTuf+wQy.XhG8OxXCyiUiwIe8xvzzppExi4vdmsshJ9V.646yNKgOe2R3yyVBed9R3yKVBe99kvme3A8Q8+zY+9RgW7wDXh1GF84YCiC4DPkEoHQ+GuqzG+B
-
@Fortune I forgot to use the .changed() formula :)
Here's an updated versionHiseSnippet 1588.3ocsY80iSaDD2937URfTApUp8ws4gpDAjymK+ohqW4H2co5DbPZCE0JDP2XuIYKN65ZuginSmDeW52j9d+Nvi8w9Re95r9+NwNwD3LRP1c1Yledle63cV55xMIddbWE0JOYpCQQ8xZ8lxDi1aDlxTNbeE0uTaO9XGrKAceDlYgZibbIdDgR6oNXOOhkhp5E9A4pUqrth+y+du1XaLyjjLkhxS4TSxCoiohjY6t6Cn11cvVjmPGmZ02b2CM4r8317I.xtflthC17U3gjGgkKaMME0MNvhJ3t8DXAwSQc81bqo8FwOlEr9mR8n8sIxAaozCLTvzc31VRDKmUYuQTaqtQQ.OEvJcShGWHHd74ZGQsnwymDWthu.ThFoiGpqsH3sUZ3oWd3olBdqG.uqp0yzk5HRjHw1kzNjIHtCvPJHMrBVqxZe1kgjJrBln0X7qHcbgAwZz3155WGcKc8laWqZspPhvSfdM1E8.V+sdJ1dBAsCJR8gDgjdvYvfF0iWQcotYzzXoZZjmlsErk3y3ULulFKUyT9rV0M2DgtQxSZi0E6BLOH.839+NwT3A17YEGBp2750phV3SwQgUVYYf3CQYvyOe6h0Nc3HnBv8kQgmu87BZGIHsndLrCrCPTX5HZAyjGip9TjZgxSkCGLgYJnfAPC3tHwHhjK34W7BBvdoywYR2x+PY1TFI1DHNSlPkd1ka2vLxsWGfFPbZVq5I0pVIl12Bd4aTWPdindzJ.TcpOxVDcQpWnO1Caa2GJ10HimCd4xEbFKGbFqN3LV.3LVB3jDxk.t3MuAfq+vfZ9Q.DsyNnstGR+Mcfm6bGc865+a4u5zYYnOX+P9nOEzV.5MVN5MJK5kO2M92AEWWB5MV.5yF6kr9m.ExQXjGrKxStMiOvm5GrizCA+kfxFFrMvC9zDQJdLhxP0C2NWOuvPztxEGJjEHnCZj7Z2LXtSRpmD5jVl1DrailaOqj14HA1+1fti91H52MaE3V1D1PwHPz0tVyDMNIaArPm9L5yg5GyZBXVYP2OCBtcyMCVchENMWjD8hTJ..gMOtMokiKExpIvI8aYnaB+mESKRJRlO0XlzU.8HffDUHUxJhYIGSEiPSARKZL2hNfRrhYJ4wFBswxICRG1ymkMmcSQ4ZWOY097Rh.IeQPNQoJOjfGPWsBbATT2kONMmsDbuOR7n1khGsL9ypgf7bpWjSymWUjZlivrgDqFEyAk4i3bAj.lOGF5x1MmO9qi9ZT18HnuZG8ygjRIBIs+nDRNs38iwm9H+siY2uHsdpMSOhKHOl0nY0SpVo5oUQyJZvfbkEZLahathkcR4tHEavlLtOwMZKazBgVJx1yhVw8rjtkJyf3RpExYGxnhG6PXE0IiRXvD5oYiPTAKU32QymF1QSOapEwUgBMtrgl7nPJ93MrIw29W+2+bOkxpqQFce2e572Eqa6IBAmEpq7bBYz0u61Rqqwr5F9puDcqD0x8podUsnuBji9+7g6iEXYyjg4.Hu3PbETYJWcexqgtzCZsrh19DuWI3NJpWNlwCuXKKM8lD+8hcmlto9ioVhQokNhPGNJ08Ab3tJk2SFo7z6b9X5o4o.IdZ2eKsmdwrd5WmyS6+93ozuSu8O9f7z5kfdUP.DFj1RZkgoUPVGLE06H9XvPX2oQ0CRr8mDX6Zg19g39DaeS+oomoXREalvBjdlMr786J64QdyVgGQtUqVq.FJlt8dfguH9xz7O3UuvigUN3bIs3FMKhP91eb4zjHrjoNZI8twrdOCI8816QUhi89EK16wsJV3lQqx680zTh5VCDtgxwmcVX00RBkEGH9PfxYgPY9656JZGwslXiEYuFR4cuFJ.9Nel66SdmdLOpXZ5udctb2jkEtWUqKUXNJe7tVN3E9R04MdCuo2ZZGLX.bfvDvttVme47+ZcU9I9D4gpOBKbo.gR6QSF2CXClD.ILFwVdVL00jryfw5xwxHSOByxe.vYNKT3VxwpgB2JRnxXroK+klAGdPdWxWzeF.SL+qTuh1Qxwn3S6noo2RWYL0h9RSSYn3F.1yWGiUPmuYEz4lqfN2ZEz41qfN2YEz4aWnNx+2Et+DAebv1DXhtG3ezMU0CXXfk4yHU9e.iud9y.
-
@ulrik Thank you! I really appreciate that. However it gives error in my system "API couldn't found" I am using the latest Hise build.
-
@Fortune hmm, strange...
try this:HiseSnippet 1807.3ocuYssaaaDDkz1LMRNtIAnOzG2nGBjPhkoYykh35Xa4KEFINQsJMnEA4BE4JoMgZoJ4p33ZXf7Gzeg9sTj9ezm6S8OvcVt7xRJRIYYmxGDD2cmcNyLmY1KromqE1220SQszyNZ.VQ8JZsNhx5scOSBUY+cTT+Zssc6OvzCi1BYRsQMPC7v9XlRiiFX56isUTUm+64iVszBJAO+6FMLcLoV3jlTTdtKwB+XReBKo0la9Hhiydl13mQ5KM56r49VtzsccbGBHadMckAlVuyrK9Il7gMmlh5k10lvb8ZwLYXeE0EZ3ZeTqdtGREi+4DeRaGL+kUUZASjn48bcr4Hl2px18HN1Mi7.9JvrzLweLuve7UZGPrIwsm3WtVPGnDIj8GpyMN3spL7zmd3oJAuEDv65Zsr7HCXI8vw1hZ6SYXuNlPHPFVhwpLW0qBAUXDTV89luCumG7RrDUumt9sQ2UWu1ZKUdoxDpkyPab0JaC9dOylf8y9Q2gLBEW+s9UDCZoxP7xmgduoG5Qz1q9bSmgXz5nHszEy3rHWJ7R0JwiHP5TRZLQIMxSxFL5DzY7HFURiIJojNkksE0b.DTYOtsSgRKMlLZNLsZbBmLjPcuxJHzxIOxSWSSOH.Awvm19sXKlOLounX2ekZ2doxnw9TbDXlElGDNOBCZ9kqUrzxtCQQps3dgWt1nczHpibhHSJbHEK5LjZwHvDf535gX8vb9jePcRvQ4KGqRE1DR+HpaazpnBFUtBRnNPhWrdQtTdzjCWOWmpVQX81f8.L1ZKU9Xg6hzoZPKnar9PpMtCLI1PukhSEqCNkpUX3OvpDILXkmDXoiiFwkKT8aa53zFpSWMEnRbVAlqw42bMNWlqwratFiwbMFwbaLjw.HuJGOKelexy14oOi21KEWlSXfs6JVDMxHQquNZ0MP5eXO3492WW+AA+m+u81aRd.Q1a9d.InMhGvX17.E4BLlrKvXZcA7mGD+ewRdSvEXLFWPZRfvI7LXAVjIxGVGvGVG.41InNgnLjOB9AVJsqnlgOrkALu69HBEUIrFVEzndF9LKVPFk0IglYma3J7TmI3giyt3txZhLtiSJKGB65VNXSup0VKaOMxoGn7YUx55qgHeW1Exp6focY8ftt0spkHwwoWGHTouf7Rn7c1o.ZkGHCXEfZWYEwnSlgSD+8DdPKqYHTO5gH8MjWwOUEjfk4CBuLHbSqWudkZOn3QmgSDLbImQxx9oEKYi32D0HOI3CWXjBlbwD43PcQr4rbAYJcDN373Xd8gDvIcDjng56ZS5Pv1Ib6Il+mKaTnkIWrmCoVAYNip4jznFURFcPtFlg31JZPDYwGwbEof1BU.qp641OIOLyZKb1O5l2LGhRw4DxjohByaw4NSlCrbFNvEdxTioJYZjjnKDDjmRiI2I450VaxhY0yj1EamGTOIgRDSG.NvnznPU1n1nT.czHLfardNLfhBnoCh+e33Zbg33FWwkn8IWPokTI17YWJq+ItL7SoUqU93xkJeRYT1t5zI29BmLGrWtcyudAuwIXU5v9swdQ0VhFHbN6zGjWq3CxKeOCVB+hz.co6SIrmN.SK538JgNS3f9ZgnBFJK3X9eY3w7a4PrwdJD3z7WRiuIak.7FdyIu42+y+ZCkoUViTx9GCV+eJVVwN4BkkuWuTxFbkOSsrFYkMzzkkconq0vjhcBDcQs3UjxQ9eZ+cLYl7qHIzIBN1AXOFgGyT2A+dhEVbgIkz1A6+Nl6.E0qDSYAjMI+7GRz2q17H4qp5PhMqmbu8vjt8jtkq82TY50jgjl96AWjZZzXXhl17MxZ5UY0zuLhl14rnIYa5i+54RSZEpoRQ2SYQNP3Eey2i2m1Tb+kppyKOyWNMy6wlsCYdPKI6iqPd.Mik.dzrVxC2jWymekhit+OkN.usE42jn05aNUv6JZIqrTH24LftqpkZalSDXeQQ.aQs3KWnHl1G+gIG+ivUpJbSo1Mxp8Truyr1ipQN4fxhZwGDuvrL6oW6yooDcLVnyKob3omFV1bJgx3cDmGnb5nPYwooFtTdTaInzbPFn.AoLPAZA1Kg6gQ6nvmyY2xwAkz.gg6mfwSCwXRqF7l+zm9TPyoLmvmLEJlSYzad+ZZG3ZOzwjk9iBv+RHgc.avH0suyugcpOgcj7xleV9RASKbutVSBypW93ctbvKrB6ma7F9cWVRa2Ncfchl.1Ez16m+7+QVTDeaitGXx7H.IU6IC62BXGVX.ITfIy2DHPH3hF7tN+ctmoElZG7BmuE14p72UC6b0nNU5aZ449ZKwld3eYmKGzBfIZvG3pj1A72QwayRSSuttRehM40VVbWwx.1yWFiYPluYFj4NyfL2cFj4dyfL2eFj4aGqL7u02VCYt8EoIPCM2MXKmpp6RMAVV.iT4+.5nw24.
-
@ustk Weirdly this works even if I turn off the useUndoManager ?
Also, does not seem to work on a table hooked up to a scriptnode table or rather it works on some points , sometimes ? Unless this system has been changed completely ?
HiseSnippet 1987.3ocuY0sbaiaEFzVvwhab5l1z64r2T4ooZDkrjkZlo0Qx16pcWaqtxwM6zYZJDIrDpIIXHgjs1LYldYeL1Gk9HzGgbUutuAsGveDgr0Oz1aK0LZHN.378gCNmCvQpW.2hFFxCPZEOepOEo8Tb+odhQcFQXdntGhzdF9DRnfFXDKp8TeRXH0Foos4WJEnUr.J54e+6aSbHdVzLQHzEblE8aYtLQlzdG7MLGmiI1zyYtJiduC5Zw85vc3iA9rItBxmXcEYH8ThbXafQZacjMSvC5KHBZHRC2laOs+H90dwi+BVHafCU1vD0GTTr3i4N1RFKe+rIzfIL50pxPcFwbr6kZKBQHsB8xrLaFaYdA9DlMal7LKzmG0gQ1LTsQZaLOk2bNJapR4JJTdATRSgREhozyw8sBX9hrdj74yvc8fMrKIvVgBU1HdrnM9Uaf6vgQ3IJ6Rthdb.zX1LJ0nRkWZTuRkce0N5weXdNLOpwki8rDLtmA2armMusvSpk.tSIKtqO2Cz2KMlPbFS2cG8OritA7vtznTrHPPQoji7FBJqrTCkjPHk8wcz+H7ZJoFREcR0XouHAquX2xgR4QH1g33L.7MJcaprJRGPyAoKtTFKmd9XbBPKiwyyicekBEOkKnm4UZW8OnWT+i5F2tqKubg8knJGZvB6VFkErpIVxar6.ZPpgHcffa1pB2LWV3lUrUQYfbutdLwY9zj1206FkXJA+b8DVACUD4k+rDu71iEBtGhANyEwwMLQQTVMiC5dL8pOtoW6dL89NLaZPzzeB9a73CLeLSt5iYx4g1edxjA25A717ahl9mgSatRxWHVE+74vuG37GojcvYBVfZrIBBR6OgarWYg840Z81y95AM5CeEdVSuIUZcds5+gF8G99uL7L30qa0CdsQmiD1AKo8WOnY8N7IUd+Y+01+wwsJeWhtSBQOmHclkb7YpRVJIqiq0n77OSNqSy1Ma8Uc61sYmn1vWW9qkc0Jt88F9pKCd37Pza5dn7cH6dR7CDS4SCDLY3p1gzIvouwGUTDeHM7JA2Go8ylkqB7HVgSdRhJzMyv9eFbvzLh7pCtlYKFkI36OHjLg10qW.Ex7IO8iEdB2E.hDLUdBDJmHmjTWA4OMTE4e6iBYbNRqjg7+36UQ9Oev3P5a.5cBwCtYRv8W2UUzsw6Uz8AOdcWSQ29e3Qn6EjsJSyn2pp4KejZV0d7i9JZ9u8X0rp0.oZMLFtFM+jblD7FUGiL8268G3Rf9vZEgVLA0EhF+EXS8p50z2SutdC880ap2BsZVbexipvDgBS9j+AKXcklw4aICnNQJKECOtM0PDkHRQi+NEM9WBSi8vZ+Kn8HJa3H4lg1KjXSuAd23NZyvlSCM73Biq4AWgT4z14LI7R3yOJx3SAMU9bLz6cMv9oW5nqcTwNQPXb7aMmiTakyTyKiTSWEox0NxVXSmAN2A.r1m.8sDkqtCb5YFxUtga7R2XvXgQnf4DsADlWNTMgCXsF.RQ3G7SC92sXFnLJt8XGhX9ZqjEYlzAbo04psRVzhWHSLUsHzaWvUg7UvUV8fK75o4jtOG2iIrFsX9twB3Kbz8+q4aR4q6fO5xKoVhLxV.e7aWYspEx288WSozp0stULWzSb0.7kDYtvPUBc5X2n.MYsGPtQDBDjk0KRJ3.hRJrU6uiyJtwOf5SBnmy64PlVJj356P+NXY8RiANbqq5y9A5cqHJI4Pa4HJYMh34QcBeHENsUtK52bkE8i9N9XAya3IDQ.SFGJM.7wAVzNIrK0xjzthrszspO0yNpw+AdR5zblAC5zLsyrRuPmREIgmZZIuCqk3snCC8SEcAMHT5aCmyVoL7A8ZGG90xLJrDudXuKRVOtyT+QbOlkTT7HRo9qc4iiNFOh+eEI7bByQFlnswovAGf1OlXAFwo8HxjMOGKqqD7coAksl4COGuxbchhU.6cOR.wkJ.9FaqkJN8GXJ1NAbxMJKHbc5TGYHRXS4HisCQbYq3eJLKo236DwI+mid+xH5A9DkUFysXTtQuPVBjyIACohvjSMbn2jdg+j.iz2PxzK1zaR07QfioMnungq8FbiJYUozZVoI+v9Jkt.eUa+xSNp1jY8Op47i+VkxnXdkw4osfLGmv7tHtrErzGAcB4lYsMg1Ry4Svwhd8XA2EBThV6HkJXtE.OUA.brBfqV4yQKGL3Tzlff45suf5KC+i8HhpbxiFEXOGhyvvcrifMGFl2BiZUUwvbNLjXtRTJDiRnEA1DWmYKogNzYql62nZ8bn4gDWWRd07NPm60Z+562zb0JOx3rMNzkyA2+Ls+B45sR7i4dspXZ1vTArswxNyv6oRxTuR8ZR3xrZKTKqaopG6N3xsy6p8oQq1l60n49qewVDCZFRJHVs+ViEr8O2nWGNaEWWy5VBy6FOWWqCAL1lE7PAXMKgshMUWQmFN0yZ0lpVqNzr+Uzqiywt1P0n8eHGZN22ymYZaLHeDW7S5VgR1snaFIaMUl7N5vrtgWH6ExEjpF3vw1b9UtjnikeP+fO+e4RDtDq.96RNCTt31NRBXR7h92aJhOQ11X1ulVrozkYydmkk7xn+F3hrKdNUe.yo1CXN68.lS8GvbZ7.ly9Of4zbkyQ9mVkbzq7JaffdGEeaAsi7jWoH973+Kn.wSbC