From ab1b8de52fb495d4112cd61d56e640b7fe04eed0 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 16 May 2023 20:34:07 +0100 Subject: [PATCH] VST3: Update SDK to 3.7.8 --- .../format_types/VST3_SDK/JUCE_README.md | 32 -- .../format_types/VST3_SDK/LICENSE.txt | 2 +- .../VST3_SDK/VST3_License_Agreement.pdf | Bin 135775 -> 135822 bytes .../format_types/VST3_SDK/base/LICENSE.txt | 2 +- .../VST3_SDK/base/source/baseiids.cpp | 2 +- .../base/source/classfactoryhelpers.h | 2 +- .../VST3_SDK/base/source/fbuffer.cpp | 12 +- .../VST3_SDK/base/source/fbuffer.h | 2 +- .../VST3_SDK/base/source/fcommandline.h | 2 +- .../VST3_SDK/base/source/fdebug.cpp | 2 +- .../VST3_SDK/base/source/fdebug.h | 7 +- .../VST3_SDK/base/source/fobject.cpp | 2 +- .../VST3_SDK/base/source/fobject.h | 4 +- .../VST3_SDK/base/source/fstreamer.cpp | 22 +- .../VST3_SDK/base/source/fstreamer.h | 2 +- .../VST3_SDK/base/source/fstring.cpp | 272 ++++------ .../VST3_SDK/base/source/fstring.h | 4 +- .../VST3_SDK/base/source/updatehandler.cpp | 2 +- .../VST3_SDK/base/source/updatehandler.h | 4 +- .../VST3_SDK/base/thread/include/flock.h | 4 +- .../VST3_SDK/base/thread/source/flock.cpp | 2 +- .../VST3_SDK/pluginterfaces/LICENSE.txt | 2 +- .../VST3_SDK/pluginterfaces/base/falignpush.h | 7 +- .../VST3_SDK/pluginterfaces/base/fplatform.h | 95 ++-- .../VST3_SDK/pluginterfaces/base/fstrdefs.h | 14 +- .../VST3_SDK/pluginterfaces/base/funknown.cpp | 2 +- .../VST3_SDK/pluginterfaces/base/futils.h | 11 +- .../pluginterfaces/vst/ivstattributes.h | 2 +- .../pluginterfaces/vst/ivstaudioprocessor.h | 22 +- .../VST3_SDK/pluginterfaces/vst/vstspeaker.h | 501 ++++++++++++------ .../VST3_SDK/pluginterfaces/vst/vsttypes.h | 5 +- .../VST3_SDK/public.sdk/LICENSE.txt | 2 +- .../moduleinfotool/source/main.cpp | 113 ++-- .../public.sdk/source/common/memorystream.cpp | 4 +- .../public.sdk/source/common/memorystream.h | 2 +- .../public.sdk/source/common/pluginview.cpp | 2 +- .../public.sdk/source/common/pluginview.h | 4 +- .../public.sdk/source/common/readfile.cpp | 76 +++ .../public.sdk/source/common/readfile.h | 55 ++ .../source/vst/hosting/hostclasses.cpp | 2 +- .../source/vst/hosting/hostclasses.h | 2 +- .../public.sdk/source/vst/hosting/module.cpp | 2 +- .../public.sdk/source/vst/hosting/module.h | 4 +- .../source/vst/hosting/module_linux.cpp | 22 +- .../source/vst/hosting/module_mac.mm | 10 +- .../source/vst/hosting/module_win32.cpp | 67 ++- .../vst/hosting/pluginterfacesupport.cpp | 2 +- .../source/vst/hosting/pluginterfacesupport.h | 2 +- .../source/vst/moduleinfo/jsoncxx.h | 6 +- .../source/vst/moduleinfo/moduleinfo.h | 2 +- .../vst/moduleinfo/moduleinfocreator.cpp | 4 +- .../source/vst/moduleinfo/moduleinfocreator.h | 2 +- .../vst/moduleinfo/moduleinfoparser.cpp | 26 +- .../source/vst/moduleinfo/moduleinfoparser.h | 2 +- .../public.sdk/source/vst/utility/optional.h | 2 +- .../source/vst/utility/stringconvert.cpp | 2 +- .../source/vst/utility/stringconvert.h | 19 +- .../public.sdk/source/vst/utility/uid.h | 2 +- .../VST3_SDK/public.sdk/source/vst/vstbus.cpp | 5 +- .../VST3_SDK/public.sdk/source/vst/vstbus.h | 16 +- .../public.sdk/source/vst/vstcomponent.cpp | 4 +- .../public.sdk/source/vst/vstcomponent.h | 2 +- .../source/vst/vstcomponentbase.cpp | 2 +- .../public.sdk/source/vst/vstcomponentbase.h | 2 +- .../source/vst/vsteditcontroller.cpp | 17 +- .../public.sdk/source/vst/vsteditcontroller.h | 12 +- .../public.sdk/source/vst/vstinitiids.cpp | 2 +- .../public.sdk/source/vst/vstparameters.cpp | 22 +- .../public.sdk/source/vst/vstparameters.h | 12 +- .../public.sdk/source/vst/vstpresetfile.cpp | 6 +- .../public.sdk/source/vst/vstpresetfile.h | 6 +- .../format_types/juce_VST3Headers.h | 1 + 72 files changed, 948 insertions(+), 643 deletions(-) create mode 100644 modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp create mode 100644 modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md b/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md index ad376b2ecf..8291435578 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md +++ b/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md @@ -1,34 +1,2 @@ This list details modifications made to the VST3 SDK in order to facilitate inclusion in JUCE. - -- `#warning` directives were removed from fstring.cpp, as these cannot be - silenced with a `pragma GCC diagnostic ignored "-Wcpp"` when building with - g++. - -- The version check in module_linux.cpp was changed to match the number - corresponding to the C++17 standard. - -- The header was included in moduleinfoparser.cpp in order to make - std::numeric_limits visible when building with the GNU stdlib. - -- Loop variable types were adjusted in moduleinfoparser.cpp to avoid forming - references to temporary values, which produced -Wrange-loop-bind-reference - warnings when building with Xcode. - -- The header was included in moduleinfo.h in order to make uint32_t - visible when building with the GNU stdlib. - -- helper.manifest was added, to be included in the moduleinfo tool in order to - force UTF-8 mode on Windows. - -- std:: qualification was added to std::move call in module.cpp to silence - a -Wunqualified-std-cast-call warning. - -- The main.cpp of moduleinfotool was updated to include information exported - by the plugin's IPluginCompatibility object, if present. - -- Preprocessor definitions that expanded to include the keyword 'defined' were - removed in fplatform.h to silence -Wexpansion-to-defined warnings. - -- Pragma warning was guarded in falignpush.h to silence -Wunknown-pragma - warnings. diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt index 1a0ce5736d..6daa072e68 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt +++ b/modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- This license applies only to files referencing this license, for other files of the Software Development Kit the respective embedded license text diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf b/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf index a18692491f270a44ae5f8763a0c77d0d069a880c..ad8c399b48ea9a2c29ff06d8457a76abe6c5fdfc 100644 GIT binary patch delta 105501 zcmV(uKKKb58-;D$GV}S0D-`@WAQ}>^@ zFWt9p7;GO>>SFZ0A5)jcK6K9XuCDsVpLwDt4`@r|4Z)@E@4vr){ruw+jmR*%)Cc7L^&j2OPv~IizW(!P96w;Z zL}U7>q_Hdw1k#igNBfBgYy*C|oe~V=l3-TPA}ta>W;JeqAlgB?KtkcKq+x_v9z)h~ zviSdf3S@bBz!UvETO)SBZP!dPP4DDl3n-qoOdwcyE@l{75?A3nwzq z@Wh{+or~;$7%BFJ&z$Xt4KofRYws9j-cnp5(PG@WxbB=Tgx+nH01hP)H&eWsn+->_ z1|*ZPuEc)aM5;xzV_Zmv${)7T4MPY`^qk&D3FETFJ7a`r{*+vlw}iZiiV7rL=iIAvP5dNxm)vP6&DFA!i))+e9JGcA#<=KRpU*+(YvRG9 zwH7LW<+|B8Lz`dbp$pKQT5$vhZ-P7iGAMv27iX+KTy-dd1w6=OtZrE>A4e3p2~l4fo0|oQ8^ZzKJffHPliOAZkAY12x;bB&d` zhTFZmo!|}sRdJJY0p6sLkO|^^F+#|HmKW8yC!-9liHTOk?yAy~tntd_;1_@=yIh!8 z-I_P&V*I&Ags%aCYgDAY57l(VayC`_BxcfovOa53 zUbx=4MW2O&E8{wONaML>d&&VT(Oeaq_QAbm0B1$Z5 z-ACtOhp=R+BUByBiF}|M8mTl0MLKryzx)AuT(ljiPUHKlo$Js5Pdn(DI{}DL2=G$i zcoYJU{D8fM+n>^Z-cNDLc1nt7r3j~q1vBus*RH;R$gfUNpy zRz8v`1Esbu;A@kfKq;c6qvIpx$;RaoHA}s2F;XX`qULrk!PJUTk=5jX%4FxYJiF!P zKsXpJg@~5!M-CC^0)@!Fu~l=MRS#N%5@a5hSzBAT0)z7Ow&{qaAZS0%vP!nMtX_6L zp9C>yG;|tDe(YhR9kx|G#}M)}3Mr&~j7tiD=%}B!&{|Z>O^}0YjXiQf(uGZJEoh=f zWiDLWaH}Zxy0$Limyj%fq3%^b&loK1XFiQR6}~ONlskOJ#@Ci6rDaQwz34qo9V=?@ z8D8`rw|5rVo<(0A-{L0A85;_A99d_o78?8kO?@?((l*x6@_SD`ULVU&k5Z`NTm!RI zU!7p{;ykt~feV1`(c=oHB~&6-F*K@Ot!i!XGtdlh%BHWXs#&`gCBCMRG4ryd`RNQO_UcjAh_cuS5#HKpZVfo`=HhFUS(5Jw*y+Zd_dSdk`e%CcLJUg$ZRy_Q6x zywG!h85MJh33eBj~**+x6*ltnfD)_1pt@V9XK8w{_$I_U{ z(;fE98Q<)%vB3vN z)~g}sVn~=9>QlA3=8m=ksfTt4Eb+hg`^8b6wz6HpCLD zRy8yfI|G{7Xohj;(j%Pp9lzYv4hMY8J_{t$aV3YE)mU~1#T~_tCy21%`6D+fX9yzf zoABV6A?=5MD$pL%Y7J;RUMNirjlVwZukl)Lk9DliXTAL~qbi!}*jaehZdsH#zP-#% z!uiG596sI*cQ^78mn!>qJYB!UQiri@q;`W})m|OK)wE}?>h0U!Dg!Y$2c@uOJKiwF z%6$jEajJ6Dv+{s%MRZYGZFJXzjWC#YWoGWkfXgL+s5w>ZS&K6U6_|&+)@vlJUhPgo zZqX{wGY?t2b63K#v1gd~Sag_NAjNg#t_O59lv0btJWvbe3?$}x^x^Av((w_9vb)he zr@^)CnoGK=qZE5+>6fLQPyFH+`fhx(-9Y{Hg-C0AH@m)Y|EXP5+yiirmr1?5PmL_F zKhExduI!h;d{u!Il$+l0YQi7Ko#1p2$*i+e_U^`V?plmn7x&*UE~zVcyzPLFZN)i4 zum^(}GanVIc0y32N}ht8-O$q@=)3@~0q&-6>AA=T_gy&4-#>7(&9k8wUqrE+)AcW{ z!gGO#{OuSSn*v=$14j@QrRQXQ{@!ZFl?Wq$M!KUOjKyqz$~RXTjv!unK!Avpp7pAR z5FhV;!Zm-zhzu{Vg!(SI(^e54$dSI`dZ%!BAoMK&CQu3$dDmYt)7KbjKy|LdRL5IW%x?t>6|?>lc&pIquM zTy*rUXiw?+$8X*IQ(1rjp?7&f^c^d-TwqflPbnY^IHN!}jed8*m+t>L+TuHt!HN`< z?g|M4F*vjN3QRPATZ=2X5q_Uv;pc$8EvY4SgE35dJdnH{IFN^sr_BWdo3Q(mzaL#o zRZ>Z9d(PQql5pTKwp+JSUB3EM>ggm7|9<)TFde4TB$tC;^+{TNSY~lrj5z%A*Ox#3 z?(ol-FNdEG^DIwhT@TjklU~-tx}3~GO(z9U{T#m2zPI>)gKuI(1Ebc%k3YTq@cW!%qE`1Qwh0f#K4$-aXgZ0@pTGX$<@WXE zOEn|6uK8epCvlqdjMPC$HzU_(l9#Xl;2JHf6B}tH4?=`xxHe(p^Lesi_}9zP{e2b2 zeYWSxO<$kgI<@~=yyq{EGCePhH0j6nvZkNJHFR}#{rb+<@JV0vIeoFA524TeyV93D zg($1^+tqiyqAzk2|KQb6NyllsuCMZzrf1LUEs1=8@;}SX^V3wsQGH5{9e6$OGp-3N=i#bb)R=lMZ;Vtyr^Gf%6J*(Mwykc!hB9~~@NO)-M zEq=&^c@!Eo5cpoHwd$FU3Zoer%+y!_d4m93jZBMFIj+4ARatO z5Cs+&;kTlbH1I;$(jBpa8^2;x$4-HNi5)>-B!Da(Gc>PARnD$V?7hcSvCdSfP00EX7)?>ggRpF8F?to7 zhr}i2zA^eE+?FFhN=IQfY?vTH^us~?npAb)A(H%zu}BuzBr%7TZ%nvFc9tVA_G(B@ zV_O@lg0Uy@n|ju0A`umPc=~bfqro$YjmT*qj)Pc*8vWEA^`v9)>RIW3e(`5iMR7lw zEHOwuE8QG{O0?jhYH7FXKwCWQP%re%@M55kou;cjN!s)?dtRx9!yddO3N_}`73Y}m zJsrGGTTSW|@Q;yHjPsaH+>pkSZQcvRbIt{Bn z=5JR7<6Or##I_cvj=bV=MCt^Obxg@Org!%u>V5EJwgK#@Z;-PMy_=M$sTtrmcR0d9 zy@gJ$;xY-prg!pilr!Uai~Li?E4L7VAfI zLPCDrFxJEjUz)8SERd?X151bxdU&zy1-)tIC_P{lTl{9}oWT*)hP`of*L11{uF5Tm z5#fp?0dHJY)?H&p<^ZX%zQi(@L?~LYW$ZV|sZ=F%6w4~Yp>morwex>7Qc23N&mzP# zBM-iAcq!4M4`s2Bh-J;pu*e5oK`KMqf|? zw`8{O1-ci;rgjZeA?`U|KAjMTlr!3GvB~h;k^G31sZD5qs2s3b&O&Z@qp)_YHGnXY zscw#C^U)1jw_9GY2X4(wE|}v45)=wB8F1n7qlxAhJV%IiIAzN{ppzfsfQsWw61e$g z>Ea@2#x~R!%N7z8Rpt0Dq{DEWw<1?he8_^N47CT?Jkd$d(FT=T^D^G{d5kt!A(`r< zj0lc7I1eL@z5!$1L&I*EYKEVhO<2`wWo75*&5K*ErYrCE)GkaL>niI$`Ni z*hPb)VE1Gt??OvqZ@JcwNnThIs7G7pEnce7>g!@8 zIWb!B`3yWpjdw>$Cc&WgY(mum3hW4SRAn}3vlH;3)I?9yXtrZ?wm;_rOj^;kIg}?* z1p9@|GL``WPPa@2K)%b zzSw+$PKa;6Tl*g*c2H0nZoC7lEzD-b3Y*o*yg4Q0f`DO4pa>CB7?LC>OjabZ?(!ag znxv^Jzi~9=}1aC$U#COnGNMSQE<7pJbN4$881B4 z38NTSANt9s>3xGN5YSELiV4`;c<7KdsaY{M4a_)eB8|Rx)@kOg zj47zkZ0SzwWp9NZc*U5CJC>Mb>QjM#8mZSnDD`n2#NMZI-G&vVn%3BS)WltTsOVm< zayG+&_*E8E_7O?qnxz0y32Jux`mDC_Au^&5P}cY$Jo!QhTZK@EV0wj;2*BW$a(#n@ zv4vkWw`$$ExmE<&Wzk_|dty%vl0gHF*`^Qr)UIpYKs z$F?ptSYc~y%;y>GyK{2Y7ff*Tq?%#jy#XLhqf9aXTOA$9W-c|JwZ&#j8giV^O$yB+ zcdo1vpUi%7_Z8k&|LR+V5Se7{KIsA_cq<1~wB8Zl{eempdLbxy2^6S{#Xgju?3j?T1yg2V zC*&B|kw(uR4l{|sx2=Zl@|5%}yg?uhF@552vmc`xdr;Aefd!wTLp-QzC*4F)!s-C(tH^afkU7`Xw0;J{BQFRONh+ zj}~(bRdE*KwE>maCugXrpbBT?wf|)d<(L56*PxJBcmv|M=Pm;p>Z&kYG$jUSYkQ;SmbCRVGGfx( z4wk^9wxcHFZHE=&_plvhO}%Ml%AO%>35SeEiL-trF8B1(_!8^R(m$@3lj1HN{x9j} z#GcYWq?fD^zoTA%_NV-tADfSq%{l4r+et7m+5mD5szb>AA&jV+W+b#+X_-%R+H}Wp zOj`?Gc>CI@E6TmS4QW$|Dhx=SVuyp`9hj^ZbJBhJ5>Vgf?e#raIH!xLN*&_Mp+nGs zz1I~9%bkIz+=VHgWnX&I)OZo<3%w+xI>pDpn#v(1KjgK4Pka##`17J^a!EY{`vR$h+=O_0F7g)^)E{QZryum;PmgE=aP@Ws)8J9=Dx@(VRp5)dGe&t0~JT4A7mf z6v`VOKi|)rcIkU0i1R4zC3u`uIdcEi0NT{z8r&D#W94S2hf7cR-RL`1JguH!__}Wb zu_r~ltSF*?XTwP2f5C0xSdopIkgAUqy4c#wR^Fp^v-Nw7z{k=eMOYjX13(n&U`e8C zi`#7Oa?a$C3=w6zEi@89X9;|%WQS`PiYcOyJ6tQI$%6bt|*cht!lZibAw1V@w$ zj(gC2;_57hF967^WnXQ#)#Cg>B`!U%$YQNZdYGekQrc06LgI2u{ooUve|5`zsNGMU z_%QE(cwnw`bV|fYu*VvM6qw5qa)v$B8vn{=<^~y#=rxgSa;a!nOqoqfw@&b4_HOAu z@&1hGj*i%4u386CNyqDjZ1*u$d7)gjU=#)m5)_zSO;dEx(u>#$($Wh4PD6ov)rtH_ z2^RM4UbJKz<2E)WA6{_(@D&w|V~Z*d94EPd>i9sJ)2uF95KHY9!dLIpMCYrpVhZ3H z?Yg_z3kum90t^D-UL{h`FOJ_&&Av#uuleMl+|a;>{0Mub-tHkM)4CqARLZx9M&DKi zk&jvf66FV?JN{@a>cD^Qep~wzm3Wo0B3{82Qhv1OKdQGbbd)2!g;3ddj$E2^C-dt|e+msJ5j2Bv-uNPeRZHTi&%j~k#R70k5 zn-c!+3D3c8!*%166h8md(sY_QgXuI5Q4`xhlpOcV;XjNc6a5 zeb<+KPoFN#jT{r%<7f0+LL@@4vU5`xXjm`Q6n%f(D) znbpL}%+p)H!ZYb+^M7zdGz?JOOn?35f90n?{vxKg|4d(C#(S&68}{FC|9n}$zAVPB zr|pbx@vncIe!8)V(&_6zem;}+V$SS#Ik7X5myBgof( z^~PA!A|_4A%;FF}QRap)Zdd9L@|?zl5^1=x467^&s5jDhZuw54_+OD-*^-sfg^6gi zoynx5!9;BKpVzXD8n1RbXrebIPO+0#XQfUWEejLZ(P(G37Idx^&vQtt!&Zm#!Ub_6 zhw1usT|O;gT%n;!BZn#~f02f|wRco>&s->@XVIFAN~3k7&?ox1MpG#*d5aYv)o7}W z)#(1FpP|u=H$*D8%sl?;0Fw!F0@Pwi*}V8Mb`hm=tw~*xh@v^*Tp5=^{Qz6T!vM?| z&1<-ShvH)=L!J?EhLz)ab*YSf*MhWQP7Q25=w@e`s{3Yqc8@AGgYo($?Xk}Q1bMQB7Ee8AqZ%Ij7SXklt zX@$@UB7V#HGLoHC&R>!p7f6sbLPbV0pFBB1jWq`eFPn3wx=wIVSf; zGfak*E+AHTr(+vN;U{G?9f`uzg1%j`Br1dTvpq^-fuvlql#9$YoRU}*4z4I{B=hG?r=_xrbem$fy;Fup(~|duG-W zO=XP@ z0TjsmYbF7;C3f@?!zqGMB4|o__A{Dz8r!^SAvnJ#T+Iq9fgN8vLCvh9twIor$a?!<#iBcGuv$S5bYx0Ah{by^0&fHbPDmsEL2o7 zVd4>&3$6XUBo!kJ9S4%&8CE<__?bOQe~h7rd8}!#1!0HBI>YWsbaB^=?CcPDyM_{b zdqp6geR71oCtBpIGxh=_hu}LVx?k%x%O|qu=^$1D?1{DLU}*-@e7f4+z86b{9Ojgf z(+xTmJ@OUlKoz7PK;4fOj`oul2O^3`bT4K8%^BI`Bvlc3OM@&cdyEK3A1k<2e)%MQe;9_8?o%+(y9KZiW3DL_ zt71z(r(uXSQ6O^3A*J@391U*E7<8e25EcZPmy+<`u4WdbV4<`6y^3ar%&c7TK+&vW zOKg#~_D*8HmMM+cSMrbtUZs+e92uM*LD_18OD-TNI4cKoQ6zGX=5R@!f0ItGDbh1s zUMpPJ&_Po)eC>;YT4vKP?NrT4x$Q|uenm|yR7njrx^;KiI#6c`+Kg0LS2dNS%KB~? z!v*iiU2X67%O0uVf$dF7p0&|Nm9EJpIaQBM{%K?)e5$(IYC6^Z^p9G;Q|O*5OH!Q_ z=i0_`!Fjk1VV2`G?Dxk67;YY$A>95LUIsT!N^J4smQ)6h$2&d`L~D{n~luW2~`1Hdju8)u9rQG^1&#t$Sze z306$_av9tP)5)gbw&3LmlbGSX7%bT!ug2Lt#WF5(b5eeDO`rmAC`?WaDqb{i*^$=O z8(47)kD@BcdcZ2Bf2dS&*wdYmiRo_eb3M??G8p<{KjMBn1hNxB)cqT4x(9HtnDn#| z?pP%Wx!d*(-9(1>mp(fg83{M+=2Mdu-RuF2czJ3VLMs=_6k{r{xs!PgMue@UOPzM# zm1NvsRF^S|?)^2vTJlmbneIVw880+-{MrfZm8jutNjQ@)f4dcXk-^HlfKf;%k$!gE z%doK(n`u8Ys@hf=U@vB62KX*qc?OE5Q*^|}KZ>u$q^V=Gu;C2o^#xd9N?`IeMbotl zu`8Zj@x){9iD%58Wj$4;8-N_UtrMTNJuFdx5Fhsr$Y}QRjvf$?8C0hFk(5w5 zXQ--X2j5F4fA~e2CZn7UUgJ%)1lU@IE^)suKedMIUW-Ju^ogUgQDrBbO_QS6{`T_E z3KOKau1ORMyxM#t1*v+C9&qeE`^eJCJ$*;@5&G;~77}jtK;~>OaV7|#X-Td}YaW8? zc^Ogs2{jL~Xy+?+wmiO(>|Haum>#Hx{+(UdY%uh5e^NXsAjG|R>AoIHCuf^eHIT)y z3tO8Uc(+%N+pjigQZWzR&Z{~@$7SvJwWhaMRjRAge049BYsMnSZbIz9%^)uUTK9_F z_xju7Aw#QH9sc5g8b$07X%;R#DAG1OE04^0Y3~_}LseUO9Nn+0)$};9h(^ zXdlcrGA5XdbYIa@6|yz?whT_!mZ`%b#*8m1RcW3zhWe;gC9aFF*QP7DkT*2=qOFX% zbC}{-LYrC-wv#IjIGB?K~lcN+!X}Il9<~tbjy( zf7mi{I<>xB*uuJaCxvQ#?KTbSGrV_b+8z1B)O~-ZZd?{T>W}MQ&)awEjt{?TWGA8i zl-n8DiGH5(t^DF$Hd^P4wt2R?T9;G5NEPVdCKa|3(%^3!3H^IN=RHBx02^jefBY#ps|q}H?c7vmw?j~Mz`DdXXt)tUm~|~~ z{<~u!exQ6mOd?P@aa-Hwvp*+PI2^4uvG{-t|WNjBjQ=FN%f|2VM#y7B$*lvu{;|L;iNl&<}bM4t>oc{gx>m(*|6>6JSyIz%9r)`nfP0Q)G zzrOwPchf)LzD>VQ%c8E@+R2#px^8x|+f`4qxX$^mU&C*!pDkYSLrfTdpl3V%`Ion! ze*eodeg13u7G^wqYPiGw`|a;<`}a2~#dV#GyT?EM`(LJ?9`hvC^!;z|;;!WF`#;|9 z-`~E~qtxP;fJdoGN;m4~clmjf@A4tc?IPdBdRyP;)%_wqZkOd<-ovl)+9B-Cq%Y}q zcayu-ec1AYJluUs_&?)+r`YA@?+JtC9-bmiyb`}0@k+SnXD~Oo7N-l3S2`|l^UK?A z7v<;O)$SH)(sXe_M_hplU+_xzn|)W0Fm%2B>H8lzV$IrK7fLLdh$TF++>BDcs}E)U zmxm|c8lIuT#MbXe!b9`5dw9OT*$;C+EU@0Vmkq`(HwBkq+*~Gq(&dNvXxrNY@LO$H z({4ffHGHW3reVeEaKu)haa-^}8C@5o(cl9W7!e&b!la1yMYzSbm^}&AvqTRB;`v|qwuFd#sl39 zgd^-pRCZ&Ey>SY=!=5cNk3@NbE+>UN0{NST+n$|7_B5L>vOxcTkdJteTMu4f+EcQZ zN;~91)-K3@S`j@r<6ZzF-eEBUt&Z-<>Ni$A5NXI>Z3Tyrg&Xi0MAD*tmsMc=Dxie6 z8mV}Y`)n5RJPDZtIT2~jC)H_LDrRTBSRFZv?n)~kFkQLVQyiH9;!Fii3u{WkaxnvG z$zq4xBfQ}~>>^4(77wrMm zuu<@Z4n;c=ido{ z1xd<(#LI4t@#ePo#1PczMPIj8lsxm~*<#tDDUM;nnDPzb`c^|LQZP(ujNlBW;?PCy zIA#hzMe}-Qgp*0U5Sv(IA!9iAMWjV#U?RSw4y?QN!Wv!Y&FtB2EFV zdh>!Bh#Rq@yyzqx&PtWcWq|h#Bp*f0$S`Uqa*XkjZ3Q9@m7{=mRY+YqB}dlhDx@y{ zNp`qQYsG8DpkC>i>xxTTM7@fvQ(0Hg5-RtoAR%mI$6&kT&`e>?#g@BrB;0T=7PDY~ zN4!9R3^vGOApRHwqEHN~MMXZN89VgrsUEr$T|s2y03rKJY-xc9j8z+EV@@6QlqE2z zLhu49Sy`U+^E@x-+lpMht{eZ7^JObc{0jOHIlemATeTd|_@8AR=OnNRNMr{NYz^W7 zz|b8;r#0Gu?24Vp^=deUp7j%Q%@1{dD=-CG>P!T3j+*>P3bS{N;-Cr0xz~+JFklg? zcneSJi~%5OG#qiNodLyUqmVLm6*EUpjB>)V$b+yp=41jxA`~)(oo8E-z&ZyIXgu|C z$DCWYt8JOS+#m`qsA%fc?Gd9}>{%$E+2cc)_nRc9X2eaXE*7!@&<| z0|3CMz#DZhW1Ta8FCp}vvlRY*jnoUdUIRz9@#q-bYy^fu9{3IcHI1*yx3*Wm7jwUDw?N$5NwS|yQ1p}j6$ zBrNXkuqTMxUXjX)2T?Rd=tMn9406XegL5L^8Pw8R@xy;eA%2QB^SM8cr=- zP=d3G8jllpuac=AjxC+W47)&nvSC;Xudr~hNOLNZ?Um&#_B35hc*0;V$vN7vs%XL81x#1L3w>6b}QU|aWq|>+8fH5D1WJ;$m=6~9r zhC|?Lb5@P>IARZZiR?qzVI)=g5sMO^8LgbL>gM{^^tiGr^4>=4#> zbVpo&bdS;TPe*GL;L|9KoZyoMLu%p6e49PD(HWw1ZFOXG_l9HBLpD6ZD>N*U>EQ? zfIAoQ)LjfO)?c4MclQ+39#zLV*ak9XSg!4V3|9qCa4v6E_aUJpR8c-w%{3)32|iII z#bQdtE!%9MqaRgMoiw_|Av^A}OugzQXM^3~z*uN~YEFLOfRS_8P-7Zq`cXM-&7SCL z^9Hk*o~z@fDbD0gP?L_FV^SZBc{NWku5E3vLH#MQ#qE7eDQqYV%gl6MjX96S6lV>8 zFca(Dw+^!=a$fhdrJ4*q&wzSdnnjr+StzmX-H(x1L(2;#Z-)A}s$6FnsKt{6Nz|FPGfk_B4$Q9f{j}{Mme@~RXdT2S#qrsU(rdTO)2mt7+RExgj!X?fh5;X zwdf0sHC#yX5@T_P9Ap1b8%^rjEjcuQR2t4J2eZ^1bQxP9)NVS=q7UUkZUd81r+Y7u zW#=SN)CVN`nPt-0N-#8^9y&e#Q_}_V5vcL`LJ>9vU2PVX%EMoSt4^N9zXP4$K!k?j4@PfkR z+$K5E(;TLa$)9qh^!JPBg(X%EVjpKvI)~ zYzl6oD*H>BgnkK#SVeq%24#MKu*K3LGhF(a$U(J7PP*kfZGp))2uOiKd)nnGcSIWY z817Le&=olh*V15s!qG!X=VwvXk)GTn-WGl~WlHMzd|rS7KsXz8f~Lv^iRTYf@ShSH%07s9NVxXD-^6=k1j+vEp$C@~YT+(zw_}CTs&9>a#0ZOeTD5TiJ&) zqbz?C@XX;VN|S5M$dWjkm;44>2x0^=^ZY0sw&lDfO|*ZZwm@w}8j;L0Ny(hHw{+DB z9c-mWvK}!m>?JWH(oq`Z+A2K>+fsOW&%DAtl(Z;66cWiEBR@TVSxL2h?7(5cv~l#GDQpiS@BVvM#&yS%5KLccV-gy0`?bes-(WF3yU?1aVUu5d?oy(Y zqcrxRuNuPLrrc|PrHUtyqVr)pg(@XR2sVE%bPF~s@LeU~m*J&bI%F}7f8CaHOBF~3 z3V-I`i9xrH0o>-37c&tVcW{CH$KL+i5)W_&|MCx--Pd zSZByA*a5O61HMiF0l&Lt-ji{C6q8_X3IaDYlWcB7f6I>SxDDO+S9l$uY9!f`Y@ks< z+g$}Dy9+ds#UQJ^fB=(VW|QBKM7>CfvR&Ob$t(sJ=-chG^`OW@@{lfZmBYVZejdai zu0qX&Ui4L2JX=%@0Y*7tRFA);^wn%L_hh*UxptZ zYLIgH_}h=KqZp^#^eWU%z6yQ2Ot0f|yQpws6z-CKl}2v2i~D@J*;n!AZ*sr-3wQY4 z-vjqc3xC^k+a`_s)89JZq#J30o0ak(hC$UFf9?+h>hP3U!^HC~-R7S6tAd~L%641Q zjBjz?v`DqYg{9?;?@GrZ(p}{ztbdIk!yho7Tc!J1 zS>$zTR3aYFQe?fgOQ~!}jOpCMe@*cLgbOBnLZq?iJhE#r)fp$fi=H4pnZc$)#GqBl zOQ`J8AOcCNCqt$sp+hYm5X~5buMw7!BizE-Z)o>fxBXFJbRv${RDPEDJ>ooabhE<7 zNRWm$H&-qcY-m>v?83l*vrzzwfL69IbIwv5Bo$Gz@6kpalCn?==o!Gae+#7^(7k_W zq14Un=Ce7{L0F3H$HVE(fX#R0*KR7?gO8RR zMCCYCAkCzC& zr@FPtGN=+#QBgFo@9)IQ1X{?w5sBt-ZFvQ zi6ESk&2eIw9OF55e`n#>@x5kj65ny)=*4&yNs{9rm6PPFm>h(B{G%^^{7{LaB4u{U zBjb405Y^jF3znE^2_!ZU`kL(|rIEzJvI$t@L^3SYo@2|twu6Rr{*)1%@J2N87H%r1mq9DSq%Qz(vLj&XI)Oxm8Gi4sT8y z3>=p8Pn+M~yIY1dX#luYLgEt!xW^9w`Q77>a8?i}`NzTo=^pQ1sFWi(=u z^5()#01>B&qi09m4$4Iho0PB~>;6~ay6BRz;C!?ie+z@3osZmiKIEa#IUkhovt^V< zJMobR*(R5MhTy=lP1HXaC0fK%>j7J6U=T}(#O_ih!hNSwNGpF`gy=C5f|#EpM%o0! z*f%3Glu~Amdbc%~-g0YeD1l8I%@Ui~g%By3m?fM5OF*>01CHgXb8Z8$018W$6{EbQ zvhF&SwDiPle}9iWd6z#zj@$!npFzU*kl3R{{hnu!O4jLT11#w$=B8@0Kntw_?HC|Sf=V_EY>O|Kv&cgDv01AR&CH zW0gr!3Y||=Xm+0?h5kvp=?tzpFFTn##pA>UJPJ#`RpApCn4F*z5n{T@y znu=`-&@yk8YBxCaI#YF=jO9E`r_A?M%^@64;~Y~$oav~CU_7QR3eo{>;smiabaB30 zMxvaRC4U-%`wGwo zuS32dh=<-p&3_^EKW}_hb(t`RVLR#cCK}Ig?X$JN$>~1oL+NY&*Y)O1ZnLW&E)SMW zlS}PJWBCMA_76Vyc($k$Cn%^z8(}&HMlKJu1&Kqf`%H0{p^_oyu!Xb=d2A`$pWSxe zbARK=F0sF>=qd>wI=-1N%~Zi#@kuDD+tmaq7_XA1_ZnA62T9R8eSF_ZGbrBxHV4W= zN@5G5LI|^q!X7wLRVtv!Ct2UMsG%njf%~(d()LWT8idthpG_OBDaCEdrdhE7dj>2S zq^E9;7BJM$>p8WkB*36aHGxq4b>}v;`+wKn|&7xFL)Y z_&IcW)PAPfT@sM{yM=fgx{U^}Cd?yu+?*XoZ5d}3y2;iyVk^O3sh6}&R-*Vxuif{I z{*E|YRA(!CzapK-l^(TH^{u(Qsw!o<1}cV5A_j$c%M#r;#8nJVOQNNB3n8P)mw!>x zo~@|r&Ox2P8Q_n5@Pd*|nn{ot3c>B6E;Jx?N{wlyQ@y~b#{EJyv6_2c$o@!pT2&N^ ze&Lb=tV|=M4qY4a%h~Eq&r?gP65VWd8bB5xC=D{&I58=@)ps{xXQU!LBz1d;( zC6-~bBT4R`Aey(1rjb2wO)xJ905jnJ110Kf~*Go~+aDrE{PGX^!;x!sO7QB@j1F zah<1$_lsI8HpKj(7HKAYBE)%$5)S)KVd`D-bVxzAD1$bXU=w31dw2h9r@C83-ki#w>;34=5>H#u_+jC|wLu5w70 zBPVsry%S=YY2>vLVS|dXdx3q)(=%kz21oJ6n>AC)FZ9KeOfsS<+FpT1Em3fc-;UUQ z*{FJNp>}JSkf?bK7i(>aE!-eo)Vb{tg=Dzf6|*F(WHJWqfOhpoaDRmPsbcZvi5HR% zz);Q{6+6BigCYOqZ(vw~;duWaL1B?7!Y*pCwExi==2Y^#5a$YO0sh*B3jQ&_yNcEIk?JD2yk-OZgbr7GV7(!#c!aK_pFt#-W^Wn8KT&p8}hdVt2STBom~CIe$23j5M@zcI-13%Rt+BKX#eygKg6Uc{%6c)%wUpy_b8i8Whk*-|$fi z8nmS!MQmp?H|7gn7We0x)$LxSjGEYpZ$Cb8^zH)&ZUWA0TBlo*nrd#3!o?xK#J`9C zI6h$Z!J60L?c3lkp~7nrT7!*c7#jFD#v-HauZ^+T|9^G@1`r9sk!`*)g@)a*KyK_X z8^Mq_zdQZ-H zVWjo0{WTXmre(U0{I=s#p{@QN26}Xbr-c9hx^@_!XY+3&X=OT(I34LcG79zqS>AT~ zHv9+K<{EjEaeW>FG%%BqeM5gsi{v&CzW1;2InZ87*299vFzRVTavK=PA>@=71U6yz zlD{9R^eVmV8Fmu_OWM}6>Z`B5Di4|I^v~sOA`_VjTPLB#%#@f`PUlt9>C11IAHSRa zy1Yzp6X$G}T2D%eS*&`}>nx{*%u5>e2G4|B&A)I{6ikqdo__g!`SgGNXFfguJ-xt+ zXS>1(``?#8F6Q-OSK*VgE4s~Jf1N(n1a;S6_}?Z&Me6>j%@g?uBw z^d3gKM~kq_`8DXH*iE~|@d5nyaA3OID<}J0k%7c59R%6XgabQEc`NuA-Uev*#^%X4 zD%)e-WVB_x{5=`YkAVvx0)pvzZJ{J#KN0=nPo~M;c{uK+(TRVoEuXSk+*Cbqzq=OO zYWELOE4U3#spY)HL(++Ie@N>a`n+hO*|J@i8>QQFW2=XS{fBSD?yJeOdo10PN4O02 zV+q}^%Kxu_1(WU5!C4^oq*60&494!~vDcqTpWSi328!0l5HF7mL%=~{cpP7Q@?t=+oIvjgj40K6N9%7K^vj(2`56|jq=k?z&$1> zYEUSIg?!u^DqYOt7Xi>|bqE@CiA-z8MzDrk4S|1%0Lf?GVuw`0AN}q2)%b)lyp5&jR6UF??!)rC*!fkMB!GutYBeDd%TPY z6;@BbSJ>><%L+bBY;+rOs| z;F}PuTk(kuuSXi51kXB@@hB+DxGs@UNC< zyG-<2qE&wa*|P3EWDLxrg$M0`UZQ`OF6%*4pnQaV-=?O3{UU*sgcoQ*Bs{4Clzw^B zKg%H=80jeEu$xaBi$ubz-WcMqh=xL`Ws2JCET(?~KLVXSB7%Z`ssLun-#H>{vWy3} za1uVjMCmo2-c|qBucncw#|(-yil^Q}q$bH+C#*3`Wi%edq&m4{bQ1(YPLA>AAvlQY zs$`sKu$(tl(0M+&W01$fiI--u(dN0!AByshK&*tF%EC5VNau8(7}m4QUZl&Bd5`7$ z*uH;d5s2Vamy!jwx$r)~L@7cKGM9b8DMRFiQreKIPts!PuEZ+%`1cd|KxyAf1gu}e z@iLNt#w%_^DmO~ss?w~8$ee;u7J4T${&CtBO7_U|`8@6RXD-^6vU`CVg`__=MUb+V z+Q!oN|6r1&tqlM!6kaj&U}`8db9{qjG4FqJg+##;d}OdptYmdMLRda?aM?g;0u(7r zk(DY$B&>n=92znCXdiToLK-=zS|OKNw^R$z-(5KpoO+P{OZ5Q?2={2BG1D!=J>`d0 zGNOE3MAp^X2f>@mzL*8r(qw@XpnUDl1;P>U^!r=MoP#V;wB1_LI)sC*u3GBE1+afe zEsqF@s)`?IN>r^JnK17}H5f0lQ$JI!s3#DLow#4E^cxWsPJ|wymQGO{S3SXdDwjt^ zMcgo{aHJR-_l8JF*#l__lxTxfQCW?9g|gzKuT*9aBcT>2DSWo*`n1FEv^T^i&Is{I*H|Z@G4gG*m zKoK$GB4HkOCPdNDepkcq1PM&^@ko$5sMMt6!ep zp?tbCzgffK{1e9r(=mDw)2Za{4$C!OM#Z_oBJNlbloBcTF_LdkkrqRur)Pf-Ds)`l zomUY>9$5>2oT>s2J^RQE$gX8)`UoFf^B%?Vjpa;dZ`pQ>tMfVA(B4O)st4IOdB5}1 z(g=4AJ`SiYQVzh&pQSlzzv#LSTYuia6xISWG`SN-K=D9D^WA_B@{BvZJ2=nB3Ef&J zrch|LxUVYGGQ6Ofj=AMMiH(1+Y$mO~sVjBwQDZf<=@>_ClsYrG;qDYLI#?uXNN1?k zjjQC+kdNI2xj`YC%fyf&Omgc$2levefCfyJ%mC)7cZRR~RDpx#7IeV4jEca2xJd1^ zXdc{$paw3&dpek*ESkFNs*-edV-st#M@qAaG-dt4+y~epJf!X=jkbTMGImA$Xjj%L zZF8X`6-@q8wqsHomWo)Ao-FQlSnQt+8S`4yw*N6|PisGe9;%{>?m}Tx%bA|wg3PLQ zFhAE5gPGqiOj7sPk>2#JTj~h>0wzD zbCh>d{~Jdve(-_sI1+#E8LA9g3z27!{(@maEWb>Yd6ti;hmSB|fslpZm-VFoAYfs& zZ%nv9@X6H|-RNqc6HXXqWTy)}b!n0c@}QC`yHWtJO{$I!VfId87kh8#mVNOuBdX~N6&FV7YziH!zb=hC_c%iz7D>z57?_ zJYcP=N}td)xb1dGZW9bSEIB3FKwuMQFZugf=>Oc9zWF zn-}AZvyQU~C0I_uWKT9nGGBh%{Pbl0+&Ei&aa5v9*{lz~{JsgrCX?9PB*plgEYLVx z7l36xJpm~v7jk9^tebzQtzL8>i9V#@{Sn@kEp-p3>#(mR>t zxvZJ=e-z&%iqGc7c+WPLVp0k=>0<$WOnT4@WZO&FRy}&XF5>?wEh@AnLc$aqg+3<9U)J zh8+5B?p)#27IMFhx?DO+eb6^O`R;Ylk#M$z@y44zVGIL!ApQ@Q$NMfBIu-E2X%y_hSe5Ty>cSmtZ!) zSnX_sJq?`k^PYcAF$bIeg{wyOlsY=}5<0ijFeD{XHXtIHuy+Nw8N3WkJB<|Wn|b<0 zrNU!Wz$!J6bs|?MH2SfTyTRrAzC^PAiqg-%02feuz|`PiBFVue8hJR+(Xj4OLl?er z=z=a88gO|seOq0dQ8guP77p&uHt;a5enrnp^LrWqcBm_ z+exTRqi1EsRu3rbs96|mwXC_OttW)M(0Xb+aJ5MgB!z%QWtB>G>zJkJr^b$fr1J=a zcoRd(R?dG!GK=cyj%X}e*qk22rF3!N2Dj(d#^|ioT>YtDX}^4k&X;7}A|18n+*n+} zR6$QFG$4Z096!t&uMUX+pdwWnUi>#JL)?7a6lhim^#&uR<*2`L3Pe4GcCCpc`3DL; z&KQ0yIOK0C=@J}YYiZBZNgK!^gDpjUNz^dVqB5s@mUbn>=X9d;% zij{wrWv3082IZ+_gZ6r!O&Gx#oZcWH`OzKPqEb)uaklr)k?xDv>@2xGnR--&u>l=d zgU6bh1sJ^)F5kEU$CWL})XEldZ*jEcKYq7C*TAP;>1{9(>1~&K9DulrJH1xpDn2|- z3j*%>3cS96*!p`2zED-;`T|$1yN4jY%oH6UEUNbF*Z2c*mq2iRrF#U7gWoSBJez+2 z{6$0llfjA}0yH_3;fg-B0s)8;3^E`vAa7!73N$w{Fq1(0GMC5_0fdtV{3N$<69Ewc zlREw|m$4K9Op~hrSOhjWGBB4}6#*cBv(IQoGb4>g(#W#a-ghkHO)?0}yNv~wgl#b3 zSYb0Z1Um^3wqR#rCqdrFK!QmO2_X*74Iz+(;N&_40#2MF`;|M*OT(^4ps(V*|WJ2iW_n?f% zb&zoP@Kzq7?@4eSU3b-{>mG6}48!#lD6_d|k^8;Rg-Imcox^qLJLou?g&su{Q9HUDO-HYxXOIzX#jhd` zMbH%VIEvvQV$d|?#42<@dJA2S`q6LEX_Q2>(XX%t%9)CKkpq=R-iPySboPkmOSVc=ehMoBM$U7sy zL*M2wS`8)Lgl>l#A3(>MEIV1X4@oGF#-mHna=3c~dJ9`|9V?H2Bt|BU+z+Xbp+7Te z=4F?SUMz-?014}BKCa20w8okBl`di)C7{V(WmxCVZ|WXoW;7oyMH|r;bS?TS^y+ue3G^rYF{6Q;uW>J_u2-EK`2w_U98H3{&x70xpzJ%K zmkyvZ{N8}CG-CN`0lxQf^b&dn+i@J%!WX>(&ws>>W2V6GYs_oRuh?7J-P|Xt+lEgM ze=z*<$S%YKlud_r*o>ZpR`?@!Kpj%}N_-9ePpJ7G<`8RSMK;0~*@^5zwv)Y`y_@|$ z`y;NOdy4yixoW0rx#}r?`S8`lKOUJqatk6@LJjpwpbTn2O#nY@0Gc*H{d(cok8VVt zMZ3^l054xa`_NPH-7lb5&`;6Z=tJlMghNp0_3-wq0P1eVcfs#|{4{F>f&Mu|9SsyPX|>fZxOH5%w((aU3_Is)yeU)g7wG z)UWbMeg?ln_~9pKhiZm8hkiAThCRcV4c|Nb;_&ZA7LRO&`o~Z$%0f+dKrQbF7<>eN zPXZ(!K`#UD{u!<7pD}|~0P!vy0cglTueIUncqaVj;`#7f1ivMCDg2h>6?h%|w&MYO z6TTUL--17f@1ei@;M*R-Pv9f)JBpu$-%s&7_+9*a{AUJ$m|+2$V@!g{F(vrY$;@A>8)XYM*hrNsa57iocj+OAw@h)~fyJ6&O z>@?_)tpc>#ynpsIykgYHBl_$lVs%z5T_oEay^T@YQi|S$gj_P6N$4KH%GgkBtjOrZ>P$~2yW<7HU>fjnw zAEWiq?oX($gZ7@l+>UG5*SUw$Z`la*U-%rp7qG@jJd2AmS1={~6kyyT96)DrAL_;T zAQ?Z0-^OKx@#E}ccn+h7-Wp^KxCuyq-$^!vUuU(blhhH%89Q!g&M}MF=hdg!BF2Cv z{sUc)S)4~Vj<(k@x*A5n-An>-+El%cst57_n{j{2JkAt`*Q(*GN_ENL^-SjZ0Ur$Z3lXP;b6jm z3zxxL{|5N~2Y~fw<3FHlu>>RQI7)Kl&Yj#;z)anMfA4_bD%1s651}up537EH=3ys7 zoHYC}K>07x6+m>D8lHh<_}zwH#SGd8b)Ep@yq%i? znD^e1E8z>*1C5#kH1QR*e&kDkXfpKOr6V_w+<}&jd}ZWvv=%KGc^vTXmXQOf5$#ZQ zGK*Ddt^siDEBFM^qhH`V0B_GgKL>mi!!GoD_;#Y_UeXBu!5bAZp92fqdI zTLdyzCrI9x1HaS-oY69WkYQH=7q%88ul4ZT09@Wi;ET3U>F-+Lhdu)w*#O8oHvxyV z1Ae$DnySF1Rd!6-8|GOb%0jCT)m@yLuBwd6Xo91@m~N$4JwAZgmgc?P9!noYVmrwlpQ zd@84`;MXj|NX=+3oJUJyImGRQ~9T5NAlt`yEc$UWJ()b=4H$XfTf(N9j zu60wSLEJ4(9h|mh-L9$KQ=qv0I_>1h#NDT(r*wp2#2HWR%Or7Elg*t09gLv|P%E*dA6qz(=O4BT8GJVaU zdh#GoUn8w2UxV(D_Ggaoy0a{z72Rq5s>rJ4mv;=Z%R9+C%xQSWIO zjvZs~df8o5UF#)sxog)BX>i~CjPacWN{HMYGbZ`;DebL~j@ySv`7>#%OjDn|o-L20D~HR*`JH#L*f>SnZSWiw=hzfKHK4X%QJ{#ZY#ncTfgY=LxCQo>o7_2Gy<=ZQ?hI7# zj6U9f9RWB#M3t=eK_Nc+ZxS8Wsq0z>vE#qFy;`|HdqHIO{G}bz)Lq?`ww=B3qATTo z^XR=w3@bOF!3Vh*wA9Q9fZnA`J4gcjt76k4Q`dLTfT0F;9JEgEV7*MI5@Wn9EehcG z^3jsXMTef0#l_SV{#TWG0RWh$U}@T**gZpkId^J9q5t7S<&ksbDH>dOtny8RE$NG| z$6a)NQT6n@Sg0@;XJ#*4x@(vAqI=T-S?$_2Eh0_Z)xB$Zd1PQkL=q#rjsp!vPWWP}FjU5+Nu>y>4UXqr$>!)RrhQPM=^MREEf88L8& zQ|`#s+#I9{O4@*uJ6Xvsz#Wm?c@_bG)j;&7^0yx@7Iw(mCb>l(Cr@D77-$iabO2JG zg}mc1IyeEhVeft@^HQ2z#smAu$=+kMq)RI~2OuX&8yHQ4nv-l}3WE13AHL|q7c5%Z zac}~H^643JOd@{-UqU6ujs%Kc$S9z=bR`h5H4u^^+#P{Y9htSCxgEk}E=>gY@vf&4kBfB6yD$zDpcey~33%xPbp%gKICoTsL|-jT}Hw zV_9W@06bIJ3=LlC9qj2$k7ijuIIu$61whFD1<&t* zfhrBEAe7bst&c1x1EgK~o_4@h5G>!d0G>tA5uM&a9x&FL<*OrPcn^|}Ra#%cO|u5k zf{sDt-L)&SYY;;fW78lr6dxZ{$7hlN{(IAr<*NxBvW9RWs}%|f)upX}LrU{bjf6TO z3lpPl2@MAjwSt^h?jlT1S9cm(!o16}ODgRG$nJtc$;DSL?uG#@iPAKQcJ*>ETtOqu zBv+kKkdjdoBN^d&`X3*>D!sppk6lQi{~OavW`UMUY2ILaH49JwA<~x~WSq@#lYBfT z_*lWtr14a-nb5p4K$Vw&JS`0}3oDpXd448&)LZQ^b9J0Hjg^P%w#`_Q`C`q>>EkWuT5OjH&0e&T@jioJ!wlYzF@6@6+1aw8_&}Y{>)#mk z1_ICeNlJtJ0b5Nv-Ksa*^m=1jUt{Fr8XBl0cnBeNvW|@;Z5rljEC<337zg7xUd9nw z%$Z*>Gw+zOWPZl{j+r%=nH@)iPY2SX25U%$;NC2Mej)qE>`0c)%F~N-_BFU*QC7<4 zv&XYs_IW%FmGCqS;$IqIud6HF*FX1c|M{~+U48vS{iR&`EQN$t@vPb6EMaomVa%qD z+r$$tBz}1QEEdn6KTBg>SnPv%U4HUbxiOmOt;x79qbZ=2DPF))E1dW|Txx6e1*Fqw z(h0GDrhrYxR87nhDIg)IE?|^SivWDe38%^5XFrR(P=D9t4q3BOx5ltmT$$#&I=gUR ze;S0zE?|aaz0PGSad}gz00$J2?)1vmVzJKcu49N5YQLp^n@EmG$H zc%a9o0gz6^ugz>J<;>N80^{aLmWhPb0NoCMfN#4^9SJAmaY*4K=0boe)PuAL!yp=u z7aJN2^-c$*G_g;`EL~4uzV7z)g!jLF$Lv2oKdvG8U60$($6}t2!#&$R-_(*A{`wc^ zoc>17)@G+Cq*ZMgPVd-v#rF9V3bVJZx$5ru54@vMwFPqc$6xq-_bp57*JJ|U-E`-F z!Y}-!=nm!p&!7n4nXRfhAg_n;6gql3bzYtSHt`LB0?3L9ZbcafaN%q|s<#+)0N63BJ~O7K|*SMY7~AvPESn zkNoP0!N4rC%#4&rj>{9;igE-?5!@Sp*%vt-VIv`@+G=GMIrSzJIg_l;Ft65&BC|+M z6V)D)sD3!Sd?ke~=odh3^eh5!r9Vn{0jL3{6VH;vTq>p06n1=`fXOb#Z1I4}w-|fu zaPpgji?P@0UJSj96{tX6eYn4?&%56cDhtek9z(Fq{{aGhnf=Y79s`4%Wq#;?Ko4@4 z`41t$kPLx9`aGQ`2Xu6ySf~fd-`tRhMbbAxe9erxgi#uv2D8icD5ws2Fk=2eZ2%pztr zFpxXtJ`LBk>AvxR3T|J3ladV@uWStFxnRP}eD9rX{Rr|~}HkLv{;!Wc0seNYoH z)Swv7Y1%aNGq~hMhxCBG`bLb^{BDkUtFh;4A8*25+CAER~ssllet$ ztBT{iDpSzw3`K%LZz2?b8Q0L_1zr_}jRqS4=tP9d%q#N3e1k2YZ$Q}4Fi|x%k0v&7 zEe6aGZ4A#FdyOv`8DpI1c;4Y~KkaHAH!hh>jBja4rQ%N~Tu!H2tx7N|q4kTLF`v(I z11j9B!m2XUEbC=MyMY-n;6Vd6l$pQFnVgA&wuwTqiGsE%91Ku@&<@bV00r&9!&9a{ zk6Td)Eyr%apXp1+!1zZ5e|Gh?5=*hEPGv|g)H*~6Fv4qPNZ@{k&&t4mHTU@bNope3hvo`D^ai=J+8eVSg z!Qy4ffHM+{VMp6E+c6lk=8-e(S@v!uF~3)MIRg1dG#ccwsBPb7e}l|$NN_OhZ}tO^ z*LL>ohaa|o3WL=WjYy=N zlj#fp7D8%ExwlV>Z=ZxxWsPNlw!?Lqn{}5*-aMcyh6z$$ZZF#0Hcvzo)`rZICF+vg zlBY#e(zaMiuA;leGfSAMnWCNQn(ChESuZ>!+^_k6vgZNs-tZIXap4ioSKVLrJnsFr za9DFhd&G6r{jBFX@A2?YT_0&ba((Qn-K)XmEeGqn8)%rWQ^G(>38zn2!bCy|BM~Ju zn`tP^ZeN2bd?V_|{Y@k3S{YdD;>K*!jUE;0&uQ5-#4qIPm-ZK4MJkR_WYqfOq-9j&X-A>Jm z{P#`gc!9&b;TDF~JUen4sR8t6HEO0Y(>3#g3z>zQ6-+;~)4J1rzxC^yuWQSIUIw+_ zV}8e+)}Pnfgi}05{3)L4BOz(KJL(zT?g!}spSx!VJ^b2@G&$e3OxV4Ds+bU8JO!YfA<=1cHf@C0+^CB=9O%UgcipN~>IHl`9Rs zl8u^@U38b+lDTAngYwKMJ?4*Kg~L3rGuu&_|Lx%(yIp7YmiZ5V4)vIM9ak2D2YO(f zQ0a&OB7sJNBh-qZ1I$z;%oH0eg?fiQ7K$sP(a-U!RXdj6S{t?UK`*q&e$N#3Prc_75Owzs>^ibG@=mI!Jfe=sc5$Hfyb zr^OTEiMo8ciY6kYxHvq!QL`P$1r*>?Lrv*8H*=KS!@K`~afn<)}>zpE;CgCluAha%h^xxUx>Jd`#}Z= zXgc7a+~A=emo}*{3)X`h*dz}SQ~(gFr)r}{0xd+6juVcLCmf-J@Poh(QihNK5ub?R zIoE7$n$ZxAEU{bcwRx*y(uCpkw6I&NGDJMVgcjR>*=K(Aqsf^><5XMfis6}a65ePu z>JTI5cD!=mc%LcS3ox~6@-g z4B+g4vt3;|2qEYKmbi_8(MiDRub&iOhZq3RCIM~~iq-H_0(ezmQ-BG?Kn5f={Il#K5M?qI>OF#yM1_Qf1c^kUULhap6H0i3P?0Wj zh$l{TwTUMzCAa~VBH)$MWZW6XV#&(7QYHz19EGh@zcl`!cz0B#<+Vv|s=Lrz7$~Ss zg))}p9Y9rHHN0v(5j_$6S>%oATbXyccO&mc-_PhQZJDmj)wSC)yYX&jH#=Y-@CA*XAMNZr)4#IwNIP*e)yG$;A0&&i_hVAr@Wc_HTP>Dl)f1GVpL~I8nR$hO zWrgcf*JW-qJ|20d@E-fFPoEO%0_a=7?geoUGq{Y?2hg{&W$cm7HLigBTi$>t=)s~# zf|esU-QRMMn_-J38ZqcNQ-TJn0RA4z=4$FdEQdz*e8%l|mDy>s&5SL?J=>YGH#TA-3gC78x*jR*_*)KiQdFOf|U~a1e16cIF))V z?Vnv8Ktzj1Da8<>2_qq(38fsM`U4{vqJ(OkIZsp{XQ_ZVM!g2IoHiPXL=8Hd!Jw-u z+d36(TUY-@`ZkCvKy)Z8X$%c0-Kl6$lBu91n$>*J9P(jxO7Ouj5BLzDRQa%fqC)xX zXNh8s$c-QKABi8CKTd+&i2JEZtwVP2#e12(>|WgihCTK@o;}_@zWc*pitMe`6X6o~ zA)sE6O_z)0qIYB-j6RrAb#)S%)0~vtB~8*@!m_r+z~NQMlZVhHx3-jpqzpYYCA}E1 zv>7FGDvz84ibex>DXI|ph!W_3Avj_!Wn5OJEQ?Z>2_z)h0fL=8daHp_fSs_ZwWx; zK#xWDDdnM}Hl&o0stuivirSDUk<0~$Ls1$=6Ju3|%$`vE+RLXcmV(QFzVPa|HZSZ6 z*`0<^$oKGysY{j*|Ejk3!5bRq7R;hW&ptE!{V!fQtF}3r%1&ST)ou3&v>rVD&b#K9 zre3k9rL?5)KBvj(0%oQas41_y3+Ygp*?0l>9YaxQG(Xko87LJsged+CQT!LOx>%5U z{&0xkM-9P$B#Vad&*V0LM1FLHX;g~w%2V@tyx7jAdqZdb2s zk87XnoJ-|85IOKQI?Y3>O>xh82o)j^j4XWG7~-xB2w-+`KMaUtNG;SIm7x;6*=nO= zq*Y6X0Z5Uavt$5NDLjC<)oiQK_eMqCQz7rEnsMW5YFfvCea2lkad`6NtXIPaJieq6 z+f;Xv8?7}pPx5)l!(IXk9?nL= z#ikbthyZSvkTL-le`LBco#vINS_bU+F~*jj7J=`Ft=04QR za8uUr)ie50>7_qC_bib|(z6GX3uX_t&tJMaVF-AYh&uT*<_QDAA2P1&_K+^ zL(FOrCG2J4WY;+*F& zZ+Z!D%FGswy2pv>Oxp`#?1 z6N#=&2l|T`*peBP$ za4;mvL6aN;Npd)f4aiS(`e}ln-t^NCC8?<@7Kg~6kCGgzRI%ZLh*i<8C^bd79DG() z)*{g8m0OB(O;IRz!{Eyo+l$@B-r}C3suqSAe~k~o)nHLQSUgo^28*~G5{?&Hzu-s( zOl8(2o5QJ8AUZ27qyolS5q~NWDYHg78>vgwOw0%Brua~#zCgbics!HIsC7D`{2l=h z3fLs{3VVgu1WqV3-;%wlfymS)a=XZGUO8;7?p z3A%wQB;uxd_}XoKHx2u{9DWf0rmw;aADQ7HL;^cmloRS;58(wQT-SAf}j~ehq&GyLk*(amNqR(buf62ZR zc_;RZ?C-)NFOiPEW^ux>e?L>*m{8rY= z4R~L}@dl;=mGOk5vh@WkV|5pvf5id(US*no?isPG?;{W{`_7Zo8Sy+Z*hmvaR2R_{ zRxoom7l><3oH`tegrcEXh*PToQ^&Q^3Y_C=SKxpNVj*2(1=eb^>ih~EH27E0Irs`{ zt|4Lq07PFGNCq%E4rSau2SNW(4>WU&;k7&4{GE$Vve~pyWwcB_H zIjKY8D)Z}bIx4uAFb0w01g1zKWnIhuTfVkr(zDwJdcQFI!OoSrklSOv&Kav&^Cgh} z)AwE?&D%TUv)vD_<7Vx==gN6Y?|!)M$PI&^eSAv7pAl4TYTd&<^JX{ulM@5lD{h&$ zcKf3M51$`7gEyk@07pEIf6l@BkgV3RvIa)FMs6!E)8M_DXEcoFR{fRNld(h@BSfk7 z0i-50qyXO%8^haRl#?fBvlAzNhn}-JnZO;W2K}D4FX^6N5 ztYT|4laOraHtaL}0KdY#iQi;S8+0Cobr>0B1Iws5u8hAZdsxQCf3gh68dUQ1qUtxm zJWnsGe}jPlm+}2a_UW+BtyewEyoXrkcd{OFB1c$&eVmGWo_QDP0ah?l%z4gGfH@C1 z;cQwwn{I2}p~|Lr7`L6MGC7-6o7A_cZc%d}_5c>_>+eGSgquC0)gsP-)Knh`FD9K^ z(FBIbGuao{D5$i`6kP5+iu5w+`Yox=6fvQSq#wPpU-z{FR_tuk|4F=`>;&VM^b#aKv-HPQ)MBH%il zR>DA42Ql9Hm98H?@%8WbJT+LF^Yi^L_AK6t>#mcxtXVTqtZQ7*{<*7qZi-K5p1Nh< z;#*!g&_Czl4Yyyirf>JFTbEz6bpIPY+vcsmcFVkmb-Cf+O?#yKvkzXsWJc*qgh&2> zU*gP+5#Xp^8Glg>n~=2#c~p2UH+=?x_irx|KSH^=WUTIIaG5{5zlR~#apXHf#Smxy z_-!tNUz$ngpJo9p9tBtwQ55}xly_jcKzmfBvXj7I@RXsCEE*4r%W+1IcgOd|Psh2q znIs#Rp^a!e+Ku)h6>`U(tqd@w`z|59H}~uXo_G$9Mt`E=D5GXDiy1W^^LhQ=fR|NU zUuHimXxlc;DL8Y{EzFl?DwcWzqR{m_jM-u{yn-}&rS zC#IJA8h`G1z{wDfoG?@qfN`#HDDYj-=`PQQ!S zICUZ()=wbAu6u6?2Vt+$Lgp^UsM;eu3O>8Up5Xj|C>{H7=IgOWN z>EWwa?TyFWuRZw4+xc0K{(S;o(X(Wl2djoZj^Ro8z9&BW=;pp-FTcKL?b@#%9zNGB z*42{UUjZYE*rSE;T-y7Szs_MxXJCC`yK1|7yZ=t^bAG@T;@BNd!De7swv2tUSqj-CmXksruaD(joC;F+9+aez^;zf# z7i*P40KmUN%x^*=pi9pJcJ<=vhspFSa8UR!z(GZ@9O;fQ5n#>!ene#Ug>Z-zB5NdB z+$S=kJNzuZr-Fdbbj=k3|F()}6@RAc47Euks#(fPVRMOEJqp>hYMXchk&CKAir6;v zOE=-0n42VZg?v`TRNV${qh(c~SJmrRb#>w{?|xP)3!%e3EE_Vo$^tqBgEquK(t(~3 zcY$*vy~c-lP7zr73d=#c>#E&h0<&8$8D7_kH4omp8LM{yi4_v5cz~kwlqQ&KqS9GQ3$!5h+{NX zBITNGvIer*?8qC_=t7-}Obg;)TA{Z&MV37-zMLDY1ByctEEECHk$-2%vjLSV9z!lF zg}SKxNviWVDt|)c4|HZvuaCzrp3py8dEZHMW$tCG7{^~%A5kCXe;?#jaiZ^$;+xqm z+->X*?oswBfuGLf7QvPmUK(3j*m-hK*Aoa%ZJ=9o!%$FRgeow*sb&WkYDYUDEomG6JBbl2|^{YVj(KT zgLcG(%7XI{$dei`(CY&|nyMzfDn$|m1wfy;ASjy6RrNWcU4MAotq*+eKfZd$Q|*r| zHc2jDjS*XG3s;pc`|_7p6^lvcqho*i@%eiOT3Xn{56$q1k=~)?&@bx?-+y87TV5N$ zzHQ`BOe^;y@-oRWnwywkwg5EwWdb)kJyoXY?N+R^(x{c{Rjj0!35Z#Vc7_0*l_>tG zp2w;aGA4%&xPNyL8!$2F8aj0{clJa@OY(LVt}bXq+)kg+WhyM?{~jof5B09zvt%n z`teQ=o~NH@Sf*cQ_=^jOvE7w$u@1Y-?O`!F*}VHOYtL6|%jOvdtMx@vX~%2!ckF+( zv-Z_C?+=l#j6ak!5{SszoPW^I_yG}doGNN-x8eaSMpn@}XgzK{Wj$?GTf2S40E?=! zTPtRjU4NA10u=@nHFQQn<8bQ?vAsfYSYX@{I}9r05FN)6FP3c%%$4~M5A|TRNhk}N z13jh+OqNO>@g$wuDcB=s%I-E5h!zoeWOD?tTvKBcp7q8Xg=A=gIT0C{lI^JZeA6|x z&J_3J@K2@HXt*z**$-COR+Q@VaeVKx(C>VJ6Te3uj;%h595|SvH zV}A)LyDYn2)0=%i_I~njvA-qtB*Ot~k>>lpH`ox$W>c#g{cd;A8xgadHtvsS;-&Z^ z=VQ*tT#v;CU92hEl$eL+;JN%vVS030Vs3J7>UMrW958<_c6;*n)IjzD@othi_MCVu zb}acq_WQB#C*O*_l{}RVA{EE0?VM8+<9`#Hq&ih}P8KJd+f|qHi(QwdcItMEx4U+_ zcSdfH-5wvvI(KMpbMA<<22CfvR=n2CX*5DSo`}V?m}df5beaRA6bS_+l*$BdSRT3UppZ;R<&kZ&?21JtffqD87do%CUw#$rqxfq7jKAxCTdfQWYAccu0QcB6G!PN28sT7~;t{okXX9+!Vd(IAl zJloY*v4(^s4cbWj5s#Q7|nr@3X$P_v?pjn>R6I0lG+NyNLmrJts%QwvA85sSwgY5tXg1J zu5pA_3@{CNpcpcrc&WjaaDTMoLo)(4;na(^LK#L{>F}0r;&}tSf?1V*@ym&KW>z)0VWnRtpDT#X6DdQmYG>FkX38rho`Z>V4p$b z&`i{+U?uq`i=+KZ@%tNDR4ZP_Y^m9@fI&6ttoqVBB(AM#-ent`Hh;%^FC&_jo1M3~ zb{BU|xOwXC*|*KR$9a$I{&{8YnCg)8kn5F(S7sl-?9^qaFFSXc*CW{rV$s$ZyiE0& zFsrf6iyUlYXqFebCtq-_ps`wQ8et%YEip3jVX-lbDCk0$kWkiHbZvWM&%|Dcv9U6K z_;5#h0N5eODjP^%%YWX`GocrV^@j2c4dIaxxGMq)G$7W>+VV~6wRFsS$ z>qY@@7a#&+^CF?BzJD^FTxRQJy?d56=f>^s0gxWQ#ry{#WDPqPwZbi}ns?8~^D`OK z+;6jalt%$Lm(W}`F9*du-k9H=-n=lhrArB$*kq5GEwKS-LEL znS9wkXmizN6kWr>z0A1#-f4ImB?!~%BnLJ*dL6GhSO+m9qLy+FJu#u55HZeS zx;oSSfLYSS2IbIev3FvS(yy$fptAI+JWZ!{fOWlo_J5L=snMd(?{r~c-RtWLbq#f_ zdSZNDJR7TtFODtrVc)ob56v#lmCz*ICZX}FHXmxQo$EuFrWZyY-Ro2p*F>MfitS5PDX1QM1%KDYg-cKFySe*2X(Ovvv8MF3%_kn2 zGCdOv<$b+B8sD|?%7;FF@z&WobCF-xkS<~StW{GQ+UKm8S{VLYF5j~1TZf)1G(7NY zd`aqyowuKmRcejXqgAPA^bQ=c#Y;A`#B;1lW9YrKZ{-)3)Hk|Zu}PYh!Mb4N3TDTa z>wh0!GO7Riy-O#3^4UU1EFYb)eMW=B!KsxsTIxTm=Ab-7XL9BDOfGChg45_WBuyz( z4VULFwoEd%XO;$tn>G--@8xOe}w+w{A)fo1J86$%Pqy7&c(Sao!7ZvcDoG%$ zFo-6}1lYs$aNY7>D$*ob!aP^(`lyRUT7j<|20~w<>#-}xYTOP632q;q z=R5`^XyNK$Pf{aL6IEpvv$Aq2L>DVvyi|#-hQL@^t7QMwZOl#^I`56O=ZBN| z#ZiaNIC}vez#rl>cp$eV>hQ(db3@1TOCpY;zi^vB*|IHI6N@!S{p^;dNq>JL_VF(` zdilw&(Hpxyz5_96%E%c`rMe3RQ7zLyMox|AsDzqQyXfjlftpk)t1gk`cTnYsLnjdx zh?&qgiCPm#G&iLFO{T^#61Dx3e9yAKLH?2BN67TQKWHIsBwA&S5yV*=ip4a1Cc~m! zMN5){qaw{7e>;6bq;vi!$A6eYUuuD;kfdW-@~E%Zk7a*12ysCj6r*!cfz&}wqM?RV znw2;rkxF!$Uy^d!6wO0FPQ6I2&Sfi>tQ9f!_{lW2qtx$mVpdC6M;${sWj#`k zP`pX$Y(sbMM(#${E^Z+AOzwD&mvaL-2IU+z_VgmvB4J_rUY?)9V}B{vq@Au^ti6wW ztY%-1Kb||6W`F~iLS$WoZsfE)wN;uYT_LT}_DI)Dd(mF$N&XoBa*Zx7SQGk*mVkAN z-Jftw^acD=g7BD*%h+kF1wqov1X*1W=|XymFwGWww`0KZjDrn2_Ba^F2dQ>7U7V3^ zp!RUni|WbQ$=fUIWPj(L9qR7_k(T@s^>IIZG6=7VVOGWXn$k5-Jk1G-SX@X+D9yns z$;TvIqsmYv3|7=HUCr=E=YVj3UzakoZ$m+yCRXO(Kh&e)*-Tkb9q3_4O&ZB`r&>`w zT7VK1FDPP&O;>%BQxz$i$qH#+nFC_JH+f*zy{G^7-L3OXl7GvSHehqDDdh0h>W0r{ z)vYUY9aAqG?73|1wDBLm^b(#v_lYl4z0AjNe`UJQ9O-)nzd5D1G;iJafABLhPcw7m zEV~o9(RwtVy<-gIOKma%;x=l-ZTIrom_V$#V$|F#hV%t$gGFGz;GkySRl}JA84Pv; z_63@^P~vIG*MCw$RnovC*#Zi1sZ72>FKdY1nC$nHv)Mw`iLc86l1Z=Uw!5&4rn+bj zmlzB1tr?Dv5wfO8fz$NK+z{bEUQeHd0dul4W?<03sCiw{0m&P6zFh^zvY-)Lq+n^F z?QzW!Eo(_zwxMl>+t3}lJBn(*#nB?R4YY9@-yGE(^?y`pYIshI+_uv%XpOvt!ZYz~ z?M&Uw;_Rl$Ei=b2(XG|ps<}mbi_WyrakGO7wk>O8x`hI2Xw9Z-8_0q;J+bmSqABT< zI$~FQT=ujSMSZ)Tk>S*>XC)eJ(R2D%7g=JH(v{}9mbo^%*qm#-i*bD>C}Q%(`Bu4= zfzR$GCVvdIMQAr-MQ!GE+2ggiwmXIj2ED$ap+GdUWSAG8!)s9##mF0tB@_$B24Z_+ zoE$qBV}R995Wg5$UbuXK(J&dgC^k3mFjreSd#d5et>619-rfJJCFIv6DE(Y zR3LV3=g+3aA;M~=TZhtB5%MFV1v)=;rb|5A2Y-y^5b&Jll47ozQ!v&6R*z9vC$VNS zS9!(h#c{rf%G%W2*vzOkf>vPEKv%bQaVfoTEH8qsU0|u`T_w^Gq>jP~TOr{2uH9&{z;7hYa&=hHK z#D7?7lHl8k8MK}Rr)8b4Mi?;Y;Z>+=B-VuyO5KT~DFaHuD*<65cyi>so7vCDsA)yasa#>S?KF4pd}jZRQF z75g8GAsU7R=>j$d{|Ab<7hhf5Z;#o|mZ9?K2xz5bGMK8x0A67}}h z-ZgbC_)D32Qx-SRx#cRe`=%==*G;)@adhXJa5&SFt#7DZyeAc$l)iQNm7B-ectdOR zy;Hu3yIS3u?$V59WJYQNLfjzPZ2$)-FW0gZFJ+ecmj*WA4a^4rhJcU@wT0$|?tfE# z$@{qKQ7_M6f4~v+ilMM3=rx5Ryeoo&jA#-sk`ax+`7q#6= zp9feth5`Wix*{pyfX>taJ(fNrwtv#KErWNo`usJtv#3H3D5)6M$WLa0DpUjm@u7V z7dTwS-;C!X_Ykzz)Q*@*!*_>zLrjRS+k{pP`2pk7b(;|R!4ZPd{dI&5AVk9m*lQT%o0naDx>BK{u#J@@;<8Q<@v^Vp?k zW?7b4?g-u?4MfgGc(a6`2OdF!BM1W)`4K^Yc`<~$LjxfOg~X5)Y7dd`+B1f4J{K~C z*7)BsVbk{1hw6}4t9wV&0xsPV1KQ-4{^@VDw>hSSQ#j*CwH zxZ=cyH%JoVp@w3j7Kb=uMH`}Jglg$5Q7u{MM^bC6=C-v}9SuZ2luhLET3TK$2Htm~ z7Wi+AVrz?%a3oLzu;8X5ovAD~qJ-I>;mAB?E=M?UYJPjM$p`=K2LQCh0wA9d6OWAI1WiFE@Rc1F`%}qE&lS4E)M3Y0cRV!PF z{F%-wLF5xUt5jRt-1I*+xAn@oX1S)QZ6?;XrkE){(7dOa8*Dz_e5#pEt8sgCcXKaE zlAEz4xKaVLVq#mH3M6KQwW)wOD-uct;);oFF_E3v5Pv96!BV0T(XRw>GMh!M+ZEO9 z(c(cZHfejcd$q4=IW19g#cEL~nhn;r*LK(T)^Y>2duo}%T8wJN+T*pSYPs6(CdItA z>wj)uYxDS2f;#4n`&4cp<^>P$uNv4A3tK|?F?)=ex`TuA1UjMYSOpB2WbfI1PWPU}OJc(oScs6k&T zMq$m1;~Mtpal0OO>wEQk^!xPZ^eX)U$C%|i3MjU0tG0( zvQCEr(?tt&s<3i{yJ7lpTU*v+47xl?Gk-R#?)rG*;$}Zxgu}`YPN&_D(TtH_tDaPC zKn?h7l*3x6<)&pBcfyloM3?Ahq(-^1yYV`q*VXI3u4a#Gk9*KH=+@Qdw&-@~SXX1# z)85$IcqjJ_?sOxkXK<Z)9f(#4FH$g)P(zP=gnhvFae>#rRo#5K#DRd2-zY8GoX@ zQYSO4F&PG~EEu4Ajfy)SHFd`mHk;cmdn}B}GS9*gUsl^KBNooW5rDE-$|Gkej9JRe z-(;P(wLOka@gSM`0!CUS#l%H&KR&a#YF9-N@9LjB^bw#|GVDdlik+dB5daOXqrT57 z1HVB^^P&(-CQ^x-1gqA^qcKy+Jbw;LLD9^owYA6)fs-g1$01EZU5j-wW36H-Q8ksQ zp$LN7N>HNP=asc}bs2^UXB&9lQ)yt|j3@_X_fAh(2{P8=($M1>9@a=2bLh*P*?5g4A z6Iwp`)?W{P{k!XzxKj2=fq2(JNSz1%a0w@jT{qK7X>uo(@ST-q{)^`1tJE`3PzC8n zk|LW(*XPqTSGulgS~b_SYJV=0B8Nz>X%nYUr1>UN6f}{dpow#+V}Lo;=jK$Y^_*$} zbI2+gH_1CkONyD3rjMuTb?-E=d>rDlmL_oOss71A^<-87M2O{7;7=Sal!fuio~Xd=uO zNp4cOE*kkWz1!5(F@J|xu8_nzRoo1bztOvM=5%&cP_lXSEJDrc0iS^AH=k^4BeP0? z7Y7Zq7k0b=!pVDRDjYdD@+0pZ_PE?GU~!bcPOt21;7@h_(ZLP?mh2=vN!oz-bOP%k zr2?)p^U0xbQz}pg5m^_WlL}0qMLjS8_i-qaP6hI1)^I2?F@F`91`&BeWKm-7#D#%H zQ-oC0T)C7=3W$$QU%Z5LOe~|<>UcG$;-^om%e$P~PN&l&nxmn-gnOkyvQz{YWm8is zn~pZ;n{aQ_U=!0s(j0S_OpMN%6P(*Vml>G5XD);0igTH{#3hl<(J;5WqqEE`Js1MM zrHohIN_~=z+JAPPC)~>!C1|~5>gp*(h9rM&^nWg$gs-eaFQHMsrpnobqk5Ae7Kumo zAs;rH!p7KG&ITBpG+-|>2d-VrPp!|n9jfUw=mdD3Yq~b3Y6V8;V2@6vxP_=!rot7g zuO@}R`4?PH#W_TRvN^o-0__@2=Etx<7cDg{;PzFP+JAM0#W&j5-Zgt>U&vw5HjW=| zwT=rpwVXGxxVT{s!`NG<4cE;n=~SW2yvE{!S~ppI)K>4I%TkrqM<1>-#cNhAyKeUE zMJ+cDZ&@rkfE#jBj}yCkvvP5UEglWdGXChg~=Z7N$M-GlG(!*H;M;jcigqIqRqS5SlChOBOs0{`Tu~Af3 z_>q%>CXSy>E3Eu+!c@t9z0>ziKQ;aIbj~{cVSk_8*bY$!=(a8t4hOxyP`DxJ&4$8L zgWd^r21*->Sc6_~C=v^LYeSJ@&^ta9fmVn>%S;$QUZ>MC+1gs4&nsB0VMY$)cfwc- z=fl0>ec@B#(_wYE%t*3FoZdbC_;gm9j;BwJg^TSC-3?5`!_&xo(_9d7$uyHlyl`E_ zo`2IbA=N}la$#mEjfp0#O`~Tgv;ue@>G5ZBtk*;Nq$n!$XJtbV)J{8r(K5AySD-dg z3bt|9!#`bH@XrqHKJDQy^ndhuhaX|KP_K4*W=cMvmYj-PyP@av3*zpfUG!Gn&~sxP z-c5x*2)dY`;ak=z9_^gs#8sc%bHTkG{(tiD$}!IFHjK$u@gKSlU@wUp7{y}yK$I^3 zk5Qo65yqBV<1a;Cs%2+JAFE|tL1%VNl+|EOEFPPVI`BqjWAp}m19MIA8fi=Ty4Wtf zL%Of_Dg0FIX#Dxwk*HlQ-Gc9o-jaAA`Uw6y^Jw&$+81iy%>S`=q}E_T4(wqpNq~Pck}EXYW9u1Px~6m`17)A)0WE&dJAVjtNC{zwosK9wO|;WtXn(l4{1|oic#%U>v5UYS zF-JHCW3BdmFAc~d=_(|i1>9;Wb@k`c#8T1i5zkirJ7P=8H7F%fYIiR&*|@~YMi-#c6^NQQvui_a+zJy%#9 zvlCyd_z!QM-2Jtuu&aC5#(z)7TYZ}EytMb`mX*x)493G-27;MbtU0)e?IE$YCpK>@ z$A@pYtwYb;jUT^h`(7(zM*coLi+vWj%mgYi3&!x7sd04ns9sw`0;2pN`X8$sNo>kW z`9!NkCyyk>Ws|~pQ6^CuwJMj`WZJ?R)gCf?>LiF1*obV**x0G&6MvLVM|3?k!oYvM zohBUES-N!kA~W;j;>*BhJ~>P{oO&(cG3hj@Ry(c*YDZ;OE9IiBlESd6 zNu~ZEdnwZ;L9V3Qm_XQVgv#hhZAb;E&AF&3UGS(u`l*VGxiqmu|BQAV(VdpWnc`*Q zPBV8~29L|MjhmghEPr#Q`O3^S!dCOv%q_wr{QJV+HHQ4SjzVWcPXi~9!#ROXrYu%q zkKDI~t;8o)1SLZA5&<-Yv80nMmxVz_YQpfOPHva6zAmWUqh-3a1KMY_to8$mu~MT# zNoprb;DHb(%2P#QstR?t5Ce6^#8(`u+NKlD3-MLq9Q9Sf8h=H?$51{+$`yHo5Nn9* zrnlS%zxg(#8vZekvwl43v<@K`?n?{qaVbOI7obX%JHah=L ze0Ur&(+5knvZ#?d zay@y6$!04c)KC~TEPlJ|1hC`8uK2j3{~Hv6C;t}mj{FU|N6sP7$hrMmvBHQyr6JZ& z#`HZY#@di|tZKYjb*q}uXjB%#EqF9(nx8Y^t$*%oJ)6AOWp-+Jy6;2xX};vSH~kzs)$m(&M57VX=}b+H7E}MBZsK$_Q(tj9 z8W$wD$CIzo+8{$Fou=+a(>3r&jYq?2g$#sltwsY z=AAI^UHx;W^I*V;xH<3bgOPHHN)l0E_#Grh!1d ztWRtF(0BD!|DcC@klLRp3(|oeze!OoP}jbtfA1=k`U+K#nG7VFgeDxPwyk>nl)bh# z^ncDtGcSbGxF(i#Y23qiG(Izb+?=L-sFc(Orbj0ZA2o&CqO-u>9ZUEVQ-|yEKT=7H zMrVk{I9JHn_Q}<^-aaK$Q*f9jbnayi2D1^pNVZu=vqpZcGO0G8C{|W@PtpX4!~Yzc z3*KwGKkzlv*DOa&M=d%bfPn&SV{fou=YRMdyUX!q_Fm7^>~k!zf<}(<&tN-QRZajg zjB20`Qw&2&^G2@`Q z&CHlRavaAst&$6yT)?xrC{y8@8CzBHhEANHUm|vWMCNDC_W@QL>VuAcx9x0IuYW}5 z^awh$d)0bA=85a#j+ol3sYQA_oCLS37Hge`+E1Y~$_sd9qa^u6(Z?`0UzGK!sBcFf zYctS=`nIv^BJ)^X5fQVPs;bDT<`nIaC8~5N2xHujgTV>!er3ncw{1Cl-z`7b8eB7c z?z!P-j_o>v+rIV1-8B}k&7)Io7=JFjc4X)9>+h6@|GcN~aogd?|MBc6ui}Nz&2U(~ zc|{Av=~Z{3Cid@Ra8%ku87?FsjcA5%CyZ8ko)5osDEW<1%S6#qmsck1 z>4eBJQz=+tENT(M{}(m)X!q#$=pQsaV1Cf@KyYvApjKOQmpseFW#(nU9&w|2WAH&n z^FiQjkQvZ?*7!2}vgv*1eSgzg^B*ljo4L)^7HpQvZmQVV5UZ!lh6& zi=w$4%8J>+?D6cWtg1bW2eNyzOt!nZRL0jG3=s#LfZBoUXeEnI0R!|CD@o!hwyST9 z@{XAs_y!v@AWAb zz24?$B#Ft6du#Y-H-vIVZ8VDQR%ZdP9X{3B?84EgS?3JRXD98Q?lseyj;n{C!uO%? zBPY6wQk6s})9F0nU^UKe_bE4s#faxPlVCwdEV5q5wSSoGLHmH6wU=>?tP7f!nHZDX z_0ZQVtHOu6sLMx-Lb4V5>phAQ(pxNgx;7+dE>P19tMd7jTO3{d3-Z&|Yx^`juZvl1 zbuF_SC#~H*{8T2qyWMKg*fcGLx@p%eTf3jE<_H6BeHWzs07|1~=0~*d`K4%SU?;jg zu(NQ#=YPwIr#(+6-uL`I@w=S98C{>)T6m!T{=y^CCkte~@3@}6iQ>CSO# zh7C9a^9r{|ABetH;H4J1r5yyom29`FTiwlf=eMY@@m%BW4Qz^Dlej*4i~2V2ZGqi| zftDZSexCav`j4o)Q&23T75nEx6tP?e71O~e8%{N63T!r-I8gbvznlVug6p6))f%Usu49K)k><;JN~v@TLklugVrs%pWeGKs{S50M{$F zrd!iv{I}I8?nL_l-H?f^QI{2DD_HLV6fTze4-fZ*!x~4r%zt#C$C0A*Rt`I5Hh&$A zCPO!C(PXLPHfo*?!I;fj=z;};G#nL2Zl6{$&?O1#7+ok_(Jz=Qss^e%W)FOB+VX*S zemgW!SQK;m$&N0wzP|F_hi@FZA-1gag)d(6oo83IZ|Xbz?Zw~OJ)y(P912Xj{MOaS z7R4GP{cO)?LYbH=di2^gUor7~+kZ`SuYKI{@ka00uABFTg`5g-1v7Gn9Risv#&nF~ zXB-JSt0hz>!F5uyGP6_hL@fm>8iq5nm9jh@n$csSvq+YzDT<}4i-5>^>R{6nt*Rc3 zu9#XU8C`0B#;D_o_wU0*^&n_b?(OtRkduLYw25ac%3MX4ORcxZOp!0)6@Rzrtf19N zI+rmTb3&;~kvc5US#qs1OHSv_B@dl5_t426kCu8xv$lEqT> zr%57|vRf>P_}KXyIEmDA9622)lU8lwNs+27KyIWy?~6D=CS;@p@wz*h;2LyI!4_#o zaE7Gv2-bN-^AMUBh$SLI0)J2B1Hu$Z7xROlHC481Q7i`Jn|zN^tJCUqA!?FsM1vTc za4+7AU&9=x1|b%=Cu*^@TlZL*0XPj>S+e9ob{sCXWw^X0Pb?Av$kDU29R@!-1&FNvBF;F11!?^naHH{ed2%VlG7{ zOGfAI731sb5@djFz8I=3Og0lr%C0np9KnQf_z$&PZk#%|FXL;PfhTshrLUS@TFTx% z^wYi69G(@jwq8EWbT>P+AWOw2aev?Y%EvqUo5^xW#$R_m z^UJ$yq(BfcXg-YO$KmUpC{d9n3pXU*QvEFaR)Sl{ZB=a(uGd_vzs|7LdaZPaaI;mb z5q77Tae^x03ME`BHW1?wuX+}*L@q2JN)Th^GM+4JaSNg7r&C-CKZ|7)f^4$(1udg>Col2_cUEx+ zH>7wjQTB=;%jXos=8D&L3Wzn{s9@H|#h5Q1i3bg#707QQZifVjNxHxa>@~wFtck6t zxN#UOS$28%^RY7j*TX$LZ$!Avzj>$!8H@pn%Z;jwe1DiYi4Tybs==_LDPw@4!Bvc0 zSsT`K)9D|lzPx?+57*rA@?+P2;a4wz<=afbGHL7F&f7XCF3Wz#7h^W#=rgO|K6>De zCw4vc@o$E=e)dY{*iDx#|MhkI9{$O-i!;>cA0A*j7$b5l zSr#!OZhyz!cn{u(PhmAQf5Txkz%5)#w2MPsWc=ocH(WYF=bs2eun#2_Ex>>0S@PCw}u4xDe4&OtMoc#ISZ3@s9ygvc zs*Ucwk>m2)VU&sK2#s$Xx2mRlR1$5;jLXW{<}l zNgqnsqCWho`4{4W))@sp2ZWzMzzlt87J-{N(vvc)Rf2{hDxqSAMW(;2zJA6`nGn5k zq*x#hYLx*)(L9~|R@?0bJATv`o3LQ$?NoA-`@n&Y!+q;JS{ee*!mMC0o|SzcvVU`i z9vuj0qS54(70l8ZtvkQHc}i__pcuN!YOP!Q#-tfA7H(xD%=4-Z$bdWwem`1vf8YIA zJxe^;5Kq)Jtj#x&jlvGr6dO=^RSxf`E`bgnX=?S$BL5suq zBSr)Y(!u@S!^kM}P$Y;)o|BXcvWZcNh-X9WmSV8I^XdF}WO+HyIIz`3}+++M?8;}cw&vbqq^U50Zktj~I2Z-~Ss9dj79nuDLoY7>8vYd@&IabGTCagC)4dg9c zy9%rF2EAHbX2PaCW`DG%=a>n|h&X0~oMCZxFL966ZoqkiZ0I$x22ak}=A7qbo%*b< zh#1Vc9nPtrm zP!$d8PXixF)iTDBQ?e#tX=C$nq7tM5A|{z!MIA&R^UEWS5`UMpk?5O8Y$dMOLZW+) zSW2ABPNMG}u|w2Eqx(&zi`JTxwXxo#I-TBbXY?v+M5tFYCQ85=?Z0pyheKha*^e}Z z>^MZMZkpK3b)US+bPvD2yw&REl4=$WJ%BG+KietluzUD-QMSe%sh>3*`{eaVMp{d# z@5mXvhaE&Z;D4zuqx6z>mvKz?8`d`Naqn|8Y8mmwVYx}Rv$CdPkA0t=u|JPv$c6p` zBgKp9dBr<`;&m+TJ*o#PXVD>IOVnmAm@+ThOS$15XhAu`2s%V58{B2p?|voI*Cm(99pu~fx!3ztV!@W z{3zIq2QY)NU}6aECal=WQzvsd!iNC`{{x6(%AdGx$B7dn9E7rZ1pruss10a>?IE?@ zWEDMTkJsyS`PI~dAx1424(2-=Xqe8@@IXpQmf}jXC!i!dY4QQPV)pPQ(b`}z>7ekE zX_jf4IDa!RFVtyTA}+FZ1g8i&1=6dU=qm&B)+g&w3&N>4u~eBk$)^6H!}en!vuo9`BwO+F8xLa5bp1S0TeL#{Tfq{ zIDZ_K^*zC$#>DbYTXk8vhd`=)m?<>x)vgvP{&b)${v|i-KS&NCx-s(^6g#V_`Os(9;cNNfJ+WqK z6T5+I-W$U;^43qDUJ$g~vYUx7!j;3*@NU&^z*#ALZVWEaC9Ranw+6|6BIgegMqX3( z1*fTQgrXtbwN=?KMcHdbOOg%2@_)!MeFP#OR`)9VWp($mH)Rdov<#_J)QUu(q*f%! zl*9WY5u}roWc|JP#>uKGCtckrCH*pBkRuOyu-c8&WWcvI6%FYFhOS0A-Jaf)e%$!D ze_vWH!NowD6(QwRn)MKuRudC}Ak)(ZK!R|BtR&Idpz_FHKq4ZFp#wGP zABV^y2CCVt=urqzTq2SQ?z!jFAi19HqDmlzMHp0{^d6%7pPcRQBsvyFomsM^D@p-H z#o`MXP5zkA6!hVM(Mvq9;D0KA4ulUFbnhXDLrkg5LfsJ=;S?`=%lx?mJ)$zh-R3!D zy>(C@u^Kj7+^x7v(c|HVaXc^<>=RVpY{PkSJkU*2tI zh5cy$$5A{xae4|y*ew1dMKwj1#rdm>4l{h;Ah_Nk=TND7VOZBPX@xYQDaLQ!-7WxZ zN=Qw#pJZn<3Q^HY2Hz37s3{=+4vRU6Fre}_2tu{)LghF3AR61~t|j#bojBh6$hG68 z-f!P|&(XVd3#MClgS(&?tBIS^Z^tHW$I^2q$5fA0XEEGrDA(R{-gGEj_d#kWXJzSW zO%==jvDPIfVYU2qI_;U7`u*xx1O|aO9NH2ltQdT7Luw*5&BGUs2XnHCw2R&@VO&WL8D$D{)WG0)SO790!~dq4 z%!jY?gOO!PylRMAXg`~EGnlznl!Mo!p8V1W=XrGNZ`rK1h(DdA&?_sZV|0QopNq2&*M+53QOUR-?vuCrz@P!cJvr z)d_K9UfO4X$o10rORWUNT|0mh)r(Gr(wt>yW!i4X1ZZ%*HVfo-e@hgmA&=BN$V< z2FIKh2{JC|Z88;TWvdpLN+TRRHjr4{k$p0M@!Nk7*1Yrh`a$xXbaOD(_|<_@@OP=N zQ*RbVWUs$G4otfbwK2TcSq|*AYziJwL(jt4Ek@SXP6?+!4%=oVOf(h$Fqml&GtA1W zyHrhNR-H~b%Hn-wN(ZEk8OhW!Q7DGXgCVCy4s+0llZ8yv?ex?yv2@%U{XW$LrYhGH zGfrCf|7a&Su^^yVX?bZJ=nX<6QplEAb6i9erVD7&;VN?PKoQ*iquHvY*-YkC!KqDq z8x8)|4Zfws#1f4Flkdo682~$zC`?_^^z&lC<;rNeb%Piz`VIIQv%$D%GyIx`e7k6e z!E`!WT$t0c$@|85i}+!hDlNxJh;1(G@#<>mV-LYTSmzlgyq^{QI*@7T(^&}^U#Wbw zFpf2u{m98^{^4=cSD0LjqW5t~v*S{6PYXe4m}*DyDh2lY$Q8qUz2J4QAC)4Dw3HBG zXegJrZndpc85ZzLQCh^j)e-sOJ{cj3wkbK9^Sf`9N$Y3x(K9aRo$Jp2VBY!PLQNc0 z1%y-BrR{qCL##!!ZpW>JE{*%S9738{8Vu`2SvlU<-MMb35>7T$9zx?A7k>^}L?qnf zCfJrFCmNvySoK^&g%|Z|0xF9Our%#_c{}rf$eKhJ))t^4lS}%MbADa@<>!8jBCZSL z@79tW_wpA0r{cSND)$+#NItlxT$55)sR+d6g0o~7oWF4L?1PjV99ww&4L8ZkCK`Dv zCJI%oBnl3jgYe$l3M<_R9GTdVNjr01U{FYlmjr&WC2`0XiAdke=V7huv$t=(&bj%} zaRk7s;#>hdBkL=Jd))0uqz`qsEskTXjMLDj376&G)L9l1+eXL8i<=IO(hz$nZJgYT z@Lr70iiEO9XUMQcy_{7NcxOye_V^(+kmQ@GvTf(X-%NBI2qnv+^0TdaXb8ztaVA1X zU8QW=73zkFPWco#V^&L zg2$c^6l0yK>!5u5cHq?C_Rmy{>Ew^oF6K! z_SFT{I&p_JA;Lf=)t+^rje$4+7xpSDV(q1c^!>vOO%_{_4 z?Pv0lcrS-3oa=Sk|822}B5*1kHM>5F$(Pvh)n$>?72dEugUUb5>k8fOnto4_z@kq- zS*7Jf!R_C4C%+MTb6W53GG7M@RJyYFHtXynm^+CLm(+*Lu`&~h)`Qh- z%K96wkw?_%*Xcj>3rJm-;l z`Y^lweGlE5*;t2^k~FGuRz-x-$O-9j`&eD9R_uXgU5=X-*Ok7r{j=z^aqq|WZG#(= z%7bmNykYXx(Ly;T#MHo)1dhGYddt2f@zjE-GkSH}D(YEp8&-Qt;u?xj=Ow@+PfELsPXJNMwB~oaonQ;QTok77~)HQM7=qr-L-nx`Xs7j>T-g zbT;TeYY0iVKl#$wydr!&(Z?at0CBcK_z%sUE{z`3`XgP20{(1rdnLT7SmlbDb3!tL zS+^QzhWBfjkFWzR#;wqz9v;wM8~eN2b*#BbcH|iUF*k+@9yiK-nk*jWC18@OneHg| zOHJ}vZxg33ZCtA!ePsm_07e2p|)E>3}`(&1cM{Vgu> zZ3wyinUOBOuWTZ#TIlhHc{RZ(?4SJRh;(}m=_jJ7#nNS2Ir1o{&Xou%VqP@skEFdG z!nW)U=S<-hD+=i(|KPSDQT)G@sNpV&W0Po(^}2jJK(-8HU)+ecmQkqDEQ=mR5VE8S z0pVpekCAxyabQaaBYXvhHHxa`#r4Xs8MxU0;4qW$!2kGeMOKi(Yy7>BTvb|@FFP6b z!5c5YtH!AB3n${|cJm4kH25Qgjn(sf41(u+^auirf@wzR9#4jh?H4XG)#Y5S<@c1W z!NL1K>Q{3oO5h0U5pjg36GIx_CCYz6e>`<*phC5OqVjT5k1ERmL*`tk1zt{FX&Jj` zKehUCy54R!iu4(_BJ7oTZ7OKjyUcK>hRIlt{fATHc+hXFmk87ep=$C%oUpm!EA79_ zp6!u^ml+u|Y1YR;*d{eeHP4EPsWJLdVul|Qpj%A94mg_V*V#`sup(F_gsj*IA9kKa zs9M{E0(f_yKh-{f{qm=srB)MxqA~--D&59ulZOH0a@y68#h;!wg!oa*kqQUMm?)YYv+R%PRKud{5eYKe-C?D~@}wb1xXw z5Dn52jcPRa=?e1#GjOb7k83oV=p9FNhMfsQ7gEfn*n@0f=oebbMRe?$hYOL~w*@9A zdH1o7)ERcYDBYzC2z#0aT+cGwHIp@qy^8bMU^`ENqf}m(!Wu@DHG+zYdKP*E_OvS7 z`dn4-ImERVh~&FS#=`1HUohf4jse80WXc+F81V~u3>Fc((x|E~frvWr;JfKXxa-tm zN~`rZk+xCbV~^?Y1|^6^@LVM&pXDP9#!D_FVt=4|ZSWeqfmf<`3@ORd1dNtJqs%6M z_O!i`@4g;sia)D!C)CE_b&GJM^9{=Oc_k!=Sf@~tc2uwC=HBj#qSTeSr>)A*;b3?s zP;vcfcMqoe12&U+m6^?KAmH3kaoG2*qv)MfIh+l+w(-Ni+@`pnX7)Q^Z{o&mjN2nN zZDNM&FBYCNDGtl3rmjKo0SDlXgC{40?gv}8I z{nCTkeIS`Grr9^Q;%P=6Gr@D!%fMo3$rrGa_flC;HO;M5*1u-kEh;OztaW8=LzpA< z37rH=&L-VGc&-sn=F2p%_*+~vUDuI<=~uDtu>2zKKiSBh@%a`!8=orUIS%ai&N1Ac z>?hVTH?$w1-u>3FD-2!ME}AF2-LErO*PaG~sn`{dGjI9MeY+p>KdM)S-?M+J>E06z z1B@T;TNf>guK>urVx(fcs%)iXE47{9KMMF)X45?PYW*W4B%|UpY&R}FV~3|**6HTP zmUn}JZVv2QR9(5kf%C4lPl*ws;k4Cvm#G-K9i2AMsF<0Q#H2eNNP|#U5t<*QrBU-7 zxe@JjCmg4?7hD5U z7s6Evw26`&!wqd+vR)Ysr@^ZRF%#I6mi1x~#t+XV|3EhgBFT>)V+Y4yOk#OEd4Yt7y!94&7Q zsXn@gERL;#l@0190!r2C%wPKhyy}38L(9Ws_ixJ0 zs&_~~sb_!0D&LiFGf822b}nQ56*FdVEuG2Ti5k|C>La-h7|Gso!7Qvny>4m@DXwW} z7gIf}$hnWAR5Yp{+}1fp7IC6jw!y{S1yxZ!%sF`~3e0NEq-RnM6LGUunM<_v%$^@1 z)`cd`)5$tuXnJS_am)j&)c2kZFwY_@GmTyXAiqJEs)L-a_M8`MA_c*7kJ+1q3;ZLK zXa`Xwzsz^0H^&x<(soKWd8fuZ*?GpL=!I*9axOX?RWJeNEBsy86ma2BR;?e`+HuJn zeK*#53lRar-=<~`lu$4J$#D{OO&B#8cRmTXDbzKtq+p*`O|1bM#RKv$yK-{}wuXYR zRYwdpKADxZByXM#cEwreDJoN@&AHNLtjCeE)K5(Vi3O&=pMx!p$JFzfMevr8 zD!a?KyliSW_FI6{`;^9aoRtpUn|}Rqft#z;XfH!L%3~SOwm$#O z`|I%w7o~K^p%OCS{K=5&(CKmN0Y-9_vt{6hdCAB+`Dge&VW1~tgT2aHZbwV)xIBhq zV$j_{(0SxlpY_2N+3naqVuK@V%BggA|M84j;aduWBMhMW@93ZQ_2>|55iA^O%8>l1 z{J8v(K8wlJAK6OLg&iA{g?~4^QwlyWqo3ko3SK_f&aCTuD za)HuA-hhYzy<`e7X|!3_iE5q%31|%}n2Zy-AlEH-~nTzVsV7|xKP1fzj1tEK%AiKNx5u8gH}agKC6m zg(cGO&67WWkB%RVgS(3-HETYWm8P?_uuW;L@dI{|r_r$H=ij*S;`PtW$E$W`j~vb3 zD@6INB9`IeAo#5{{4s8d9*PL=Bz4x3RIcO|IV;<;DU?lLBJ`$I@pB80A>b+db*Vrd zert2B{PRD#z7^}hvub+VRQZ@`^dv6G(fYl$WUg_?qKLcadS0vld$q{SQaOBj1sNk{ zWdZX)fq`+^rKQ?Rhn3esy9jhJZw||FUb~WhcGkUAD`!DqtU#8Lm&MioqW7e;qxPG| zAVoX+n4gW&+9RB6EoiOz$GaJbI8xv3rq1!EiebOCLGg7JI@iKGPCx3SeEAojC3moN zXFrlph0N^YBwC=YiLXMDTTZPe}X?T~?t{>nmeNhMea({=Jl(nH-hqy0Oq+;;lGv6xO$>%#Oek3`mNO z_6>&Yrj{*&^@y~LtS+gXm$TqYS+C1bg%0iaNEK#plIpT(52X6>uO8YKR}e~$wg2JF z-%E0QT095~#tyj`(nD=p*YP1NU>(xKh1o4!ER{einnK=Re3_moG*sy9dnbPrc<8t{ zIX9^&)SN3@A9uipR)aWRd$l);2I^ArLQsx`Ut>m~|Bbwa71jLZ>186PD7Y?-a>1Xq2%=`x-Xs+ zCYso}LYTFD{F^Q=!Sh2oB`rID3J3Y|C@46K@|lMDRxn+^<62dKrZ|j88{k%~2=HHe z76oysIfgn3lS;P@d=<^lu`WK1f#SoHDl1XbD+osjV2wsHd!GpPW^(ICTdSuh%G0^z zGI4Gx##;593hL=YkR5Z`pmQc4p?)|2sMo}xZI0=@Ul6}Rtj1B0%edAI)EM493CXOW z9`%Q>20jHaR5cAtj6(#Hfp*6xE(Z-;k1L!|D$Kj5OZ*X@`22^Me_YS}gpwyTa^P&m z`iK%bVBZwf;5e3kLQYMYehu9IH5ks6gj}YR{$b3fKY23F4`>KGN?o-g>;JC-6H!S#tLt3a#$!@ekj0N}UcHlkk*?#R3B z!9Nn`{q7kM8czF@;|?(0Sr@l0eg>4(bLdvpt`D^JL^APhGDJwVod=2bo+u=<+CXXa}we)O4P*t1OA!RL}7=2mjBjNAYG~NDlmLl zV`{ZNAF_lGx8X_udTe#s7Mk+U;BU>VxuE=F8)lFC51rL+c22NaRKc3gUKYMF=Z_gt zs+o33k`6~ME&YNnQLp0W!R3#UvPa^@Yso{$Uq=eFp#E^32mseJ{qXOg@jzhLtL~r} z-6X}5q#EA^VKJlu9)Tn1?wxOYKGZAuG>=?lkh4FMNM#PSKzir^g zw`2|8Db2?&DF`$V;b(z}75)%X_eT*Q5ErH1z)j$ly{8JU56M66>gMq(@UgO+%yn6o zfa!U{ZdUwyQ1Y;ekFfDwcqSSZ-16f2(0g}L);c{`e*iaMt;AJA`C`6WF(npg08kSk zc+KSe7P5E_-}w$!jd@hl~b70w;kNyOiKyjt0U2T3ax307o} zyCCiTo{8L$sColietR$VoGC)J#0(7?WYH4JRck_2wol>lxBLD#PtI8sGhQXTOK~Sv zJ`6e*EJ|XeAR=S~HGb^Epq4@Khq2Sm0I^bxDv){D&1b<$aT@%*Yb{iIAzqUf5>M+J zw|m)J09TZd_Sf$5C|NZ@v&J_IiQJ?|aAne-Gj1unH6#n%%29AS2X?t~@qK8K97cmTpoVAaRdzpB2v)eXHL&TtXgC7L2+YhlNNbWam*}L zp+q4ik@RJW7|p-B1I{CRCjM9t(yPX%7GSP;)B`5az@1u8)S|88KZ1pht$JPTOx5|q zst`E$ifT>raqQQSPF6u*9KtuXmGjU{eWhbp!vDl#Zd;PtR@*jiM`_rqH*l~|^D7=%i-3ANG0sTDU6l#)FQ;3^|DI) zcK{MBnJv$QOplC>BCo zqU{K=ujEJ|(LXXO2QK(i5*aPJQFG|>r#`*4aQVSXp<2J0QAMSG;rs?90T-UxitbVe zVX{zE?%J@tCf%-XXKO;`1rN2g%i#lZ%85ZaM(1#4=`TW{6W&TC0;&uu-l6m(@T*hA z6nJa(!hG=>MhU1Ngp=S$2OmD!p)f?0MdcikDWZL`%|^&eqUQbFw!MJ;z(MF;R?mkk z&HK#Xqv;R(VF)L}vzTRK*L0mx>9c8{qiHh+h9Gh}=4n2ALY=Yly9=RJjXDHhzPL3;xpcM? zCb+TII{RrcXh)uLRaOUM|1C;yVcTSKn_f7NZXPlB<1`nSKUO*ffc&=aM0Nb;n}OT& z7I&5%q8tQM3M1$BObt@hvh0G>n5%09)=A-9oo5HBXV@P5$sHX7dzv}&sHwSty&dT~ z%-&D$WQ101dWM}w?P+QlB1lBKl~EE$zLlUR~i~>w+&lD zTKr@S^vuo(b1??bKv`hQ85iOFmrI z-lE8?X1Fo?)Fa7bf&)pB3VU=n$O^NzClaS8epI49fvS~n{Zgr?lKqgo$x|$z=$UhT z12Jlz>oIj!e&{v9>9;hEig5I3=s}^?0%prWk_TlBO(aA&K#{FxE>1N&XI`bi#XFrM zb~4*I4Z<=6KRPAo$#AHU$e{sEKKU13t${k%bRy|>ndGJ7yEoxN^`eLOC?Ng4zZeGoYZz``CoL9XU76qt%5kb~Q zH)4i5sh-yeKn&u??%+iT=i9mZ>I={Q6?&RZ67oPO@EW@1+WCaC=si!~C|pKTMjBIm zC)pM4QJwnp8G*_>*C{(oacYt&hR|#?`Rmx58eB5@lWv%K^z>kopvl7M%@R{pq#~9B z6B*zqKp>eoAWerDh$6syf(WYJ9PFwF&m0n29=MD|8fFz*_V`l96r`Fxnz9Py!l5bz z+Cc2$qIjAY%MQwIbmE9_E_KE~2&E@jg}Cb@IbQQY3~+Pp_wZtMF~?*C*i%f1deTta zpl*{Tpj^czqBeH92a_6tWyX>h(H7yw*6j}xSfd;@=4{#~K&`l3DLJYDL+ZV#w! z;6KqPXhL|N2VA?Xj#2j;`X`B^k4ZeRAeH;S5I*qUVSh$6YTnKuhDLs%c3Sw2b?XRN z_%1)AuW-CXMJo&}qzgLpwy(Xr2e40@Y=Ouc#Q~g7(rOA%hvhhJtrr=4uXm5NHy{`V zuaI-QuwMRxqjT}KF{zKIVawxD5wt1mNmyZ{oaYOVG->0Ov`R>DJ*GVL7rWWrcvRM_M%dE0uNv+ zq|<%$qm5`+&tO1gs0f5?7Q!Sg@YNzV&Z@Fkd-k7PSugkC%}f6xY27=3&!jO_YD5B$rbc%cZqZ$=Td$kj)$ICwfYMZ}m zlD6L^$>>Fm&hsa7#q?`;s)Rwr*uI&4BE(l5&^kg)ET(3gj#ghXv^N4`JNdz47ixH# zGq>Vw<1@E=Yz&hg#8EccxnLI-w2qddAL}v%%ab1!|IMu_knM1Ot8Gt)_=hEO)&0n> z{Tj-FxT+K;iVyv+_McodvFV>Bf`G)1j>^RHfu)}0vBnEO-ongn)>Knm|3`ekxJu)) z;B*t_cG5B_ULz34r;Q%9BF(MM7{zPpmD<0yyHq}HZ;&c!MJqU#SEnA^pV$yS{i-?T zffPl%p)O0p+#25trSl=9=efX7Ua2|VDYA2`TeBggNCGzpVY-k*`I}x$=$$k@f+M$V zYcZ%H*C3SzxAK`(VSI$tmwzlSm=|3c<(1rpCch&1fD_2EIh?bG)f7Fa|7jrZjJL@N zQK=zxZ0$myKbluyh;&iWVS${`fjPX6xF@A_EB9GAr?2^%FD8_; zVRhqP&#QBFb^}ufnll7tQ|gxr)6->#+NHC_shYV*3qtT#o$FIXZI^_*@07)TULMzY zmchZOt>FUSz}{6m_EZMFG3}(MJ8g0*`RmrRLO?*$N6*Z3Q6@;~>#&xhO`~I-yvj$Y z3f7E9i}|f=YW95o10!DnpYv9jTiuuS+RG0u-hzpw86uL)j_?M?k|XG4kj;Bl|M15G z)jRh_up>+GejApP0n(Y2#5CSxMU{{`JpqEHg8>qK8(yZ$`m$nYWP(ipfN?6ITJUi& zc>(B(lZJG85q|$yT>63iCX#K>I-3XTP6oHLu`EeDJUq%rWthTRks;Ob?~>2UD^1nS zbpTmDl^ubq3fXnVZ|*cC3`6ew=5G1hZ}Af>G&N*O<~_LSTR|dy>ajNH?UI=~!Y9gv z@>xW6VmXYKmkfPY3f`{;cYQbZE zJkuOgnY!HYYaho5r4AnlUQzfE5WBJo4ohMinuMHh818ljm$hg*N7mt0ppO+sb->8s zNnEL5b1f>d_F7#gUFp|4JRwQ_8Vk>If|Hbjh}}Ccj{4!=Tw-Rkl9y{xc~za0V1Zmv zclmHn7sLGi!Otn|Rq5-ptH&B*O!HPD^zV4MbzViQqhWot4i$@R7|Zp=-(g z<~D7ALfho0ZdP6yG+k918HaGIn2S+S1kO5SP59xvK_+s?uw9hhsA{roiCMtHkG+)w zy!U?;@`d{@%p8<9f3Ula_`tWSue{GFJ}4=ez7=(}>Qo`Lod+vB`+rq`VG_N1lXy;I z&s!)P5Q6=uD}$mBQJ|j<{FSNDoNOttR4N_I^X0|@QTryB-9ECrB-}>M=kQcAh7^2w zmPHp_4r@jiuwnPy1}8NoHSDN=fZntUpo6eGTc%mc24;;g`QzOUEJ3uS1H;U9CNn@_ z4CZKOxSw$1cD-IuA4oI|pQit5VLGb&MZIJ+_`XD?2EmREt4I%con^<+r1q`PyCijhP<&f$U~W{C1O-RPMsAHOFoz zR3Kx^u^lg^U1zCGY9)IcAcgTnK9%!`BQPDp%PTYKsWoYaoWy1q&*8MZJYoz}Slk<* z;ljaVD;n`*DCr}dj@ag2veDHsjb1due*I!qa_CPH zs6>*H3udbD#Mc;`?F}gx^rTI%N?dHO{MZSkT?N_`O--Wx;k z=>mNrP}cEYolIRkYLI2=R9uX7itJo?lJrnK7*OA}mEfgzIt*MLr63_AnK(<-ljkp; z$O#YX|Gf<$R8Q8Ft0@Qip^c3_-vuC(I@NTdOecE;!{!wkn&M&3A*fkPEQN@jm}~4y z-G$p0m#RSsR-$~lr=MdW`->}Uno^%wkB@borep4B4fPN{94tOU5M?kG9#&0O(#n#A z7B^5~5ZWh)2urVSN}!)g>T7(TI>k7yFeB-qOjQ=5MCOL1QS+mniB`NKDn{;wP$)`rXJ+{-0Dmo zVytzq%Jg&NgwcL>d{u-yTj@zr%2`U=O$KzAkpd|S*ZG;enMDHWqweSX?r29&H&SHr zY1_bCn5~MU0OGly@Ar|H2%12?zQSqf3A#qsoC8lqFTQvMN|v^5G#;LGCsD@z_)j+W zEiJODD`Sp=Jx~8@*nSV{jM0!K(9%8bdSXLOiPP+N{NtFwaPgd_lbG2pKPQ(UC2Ss@znhex$*KdGt-vt%9=( zooZg0~!)qIjiK>1CP0pmw-)}@>Wg)8$Daa znv+-&=ePOf4^9^duRo<-1o?n0lUUZXIo9US^=pSO*6K zCq>&ALCfywU0(c~7@mV_O3dM4m`onw9E;X`?kX)O-1oh3yY4NV+<(ly-6HGM{vihO zPmtf^oo>STlK9LOoxaCqiH)n7%));QKi4B3P?=Cs{%V}2lWy_xMn|0;^y6^IC177t zMiHxsnGDXEQ`$l)1*@isOqU3#I8}AHz(6Zt!;wqd`CCdPn8YB5=Dp4 z&#WlFVM^<8K6^=mg=TiRKl3TMDXfMLHG~-#%S?eqCl`Zlb%obkKKj*k(Z3f7Nmr0= zQcJV6&boL%AXL_QO6@y+02fDrA|Mf6hZz1u7cdp%pAh|~*XtxEi-iSHEsl9c4rR$i z1UC+(Z-+U)6*rvjLAMgqFS>7S#-^u^%kUrv`vVuIBH?@0%yNX>c@4YJ7o?sNhTIVcEa z7B>>qqccg>Gq{j|>ZY^@D3d_bS`-O&fqV($f9rvy?A@Wr5+U7FUshj!xG`}pV*7)- z{JV_G2@U@3_={RzT6W^W!)YE1ixHz;-Gzj1$8C1J<6NMGzJf6U-r&FG&fuWrG^I*8 z^Py3inhp80&k=qb{Ll)6t(S4>c?0_wAczUHR~vc6P9Gwn^pjb(#F>#d%(`;nAT>4P z!AX>m_{K4fs&Y?#ql?VmFzTukDcGl#fc!oyfP=Ie*+;A-`WLfcd?az@DnuHaxZ~@# z$p#lM1NSBKKCA#V@FwO1shdFmjxS*L?yc{qkQv`eWeBC0R5ghG4no3rs9Od7Q1WQLNLz16d;O|7fC}@Y8yG2lM42Oi-8_)pnVT2`mMnzo~ z48@Z(<~!%)I{5P){2Sh*u5gxk+My=xS)P;fEv*`Gh`U7Xpm{ud7V9iTCDcF1+T;aY z;2mNP|Cb!l9*0$Q&L*0)iqF-f8i`V1mY_Ni1X>ReWxT!?2!;)3i0vt`(27xExqj}| z?XKYt(|?VBWbV)wFrvRNmB=dO}VS zRcj3FO$>Nj^CP_qDpf6JRj;|$-XQc~1_7{4aILsA>PJ04Sf=onNV4M4-mzK~Fo_)g za6G=C;mDfrb=EnW2<l6uc?IK`;jD@=J{nC%(p**i07XxN1;-`N|H|#UJa7~-#Jpj~a zsDu&qkn-27UVFBx$5g=;cXYhZ9!>U5&P}F~o>)quj0Np7v^cb{E+3)Q4T;~@U!S>q zv{=uzCq?|W#qhwoBoZ=*{|S?gpAAu-6ww9m)`%>`NrH$2rIs^5TW9W{7#{gpD&wd`wGkFc&piM&$Ovn9bDX;g`n7@m`cwQPa+9_z!q;>v^gg-= zv;0d7Sl%y!?C^FP6q5}?%9k#95|}2~zr&$dymTnK2LCRgMxd6?oKIWif9N(C*;H+q zR;ixQ;WHH@A5r*sGF+mAyCbZgt~7024fzdZow~n{`wbxLY3W=}AH`;(HBAAUc{~Q{ zgg@r0Rb9K55468IYuTeON@zVx`oloEy>M{y_)Q%?HcegCN(?mO5yr6bbSz4}o%h!K z)Z#$U6a9>Z-+Tk#*eg>e04ljcFeO3TN`%u0U)ySl{2LM4693-bXxhBh+pe8VPh2T< z{fHZ0&lnB}h9g^}_EwMmp!NnH{9nD7Ucd(#N7joHIr9yrw&z5i^H*PUa@Q%}A~5Py zUUuN$QZP&pgsTD-0y0euhM=C;Y91V?KaigVL+=~4<1=mzO+|Az$}uor9n_zFYfp(n z7Y;_wcP^g^oDr%FX=-TUkkpMi}5PrIx%KbM607YS#k6F7cygIZ`5+ zF>imUIrA-1_sD*7tbvD&gZ4*RQ)Mk`Lo#QJ4tXn7SajJUR&fU!&Dsi&QVq)6{$M)!n;${NpFMYMaxDCR7!>m*6$M_; z8pzVeTz9(~xl{@OKW>aHM1hSo2h+H0mRQ`-GYm4QG@T#Gc4X>2bH@EeFeM(g(1M-7D}xqy@Q z^Pjyqp`gcU(CZZi`@HFpaFl0Q>@uGX8T&l>7(#ulQjZT{2mg4GnkrXtAuFuX&G+1) zl*(qu-UDTegyx@W#%qJskV?NIjfCFArqQ~(2u(Q$Z&Ht+%;ZKzGuEu9Lj$F4ZM_t#7h3M3W0waT~3A15!~C%#tP7M5B^U|M`5N z#e#~TBKyn+aBs;%ro#a~@2hebUGRpAbWg__+I@?NxF-~b2hbX5D6x+OPk1DT5W6So z7wMPms7G?hT9{S6%b-VMO)-Z{37se?&Ro^F*Eu0f}@&Q1Z+ zc;+7npaPpfJO*B|MsIpsF z%djt4ua}m5U#eVMuW5H^wJ+OlP)M8LFvYLkvyEBGtjVaZ$g5Ilh@9KCCMt_NvG$O+ zh^jI#E|e)r!f|5#qLyduSXNcJysv3J|AM)+tvSE+2A{~du48*fsGO$t^&*C%4Fout zWI=F&wSp-NVZNwtHi8L4`yl?UVT2GwdPFwL6Y*OD=*VoGBupd@#@6s`%$%&8pro&0ETC_VV9_91bTA4Cc6PRS#}Hyb zKVd97jR_<8fe&ir$QbgT-CQD^Y|nzsY>JqD28LuaUkZt&o9_Dlu6e+&fZ?le^2tez z$|r-8tI<0s>-mupobz&FaK^po zV+C+H)3I0A(VdO()TmcN(hZOM6M7<4Y8eK!JDvTjuc_){Bxu~!thrzPyN?O9Q4n|W zUgLXI(dm5j*SoxSUGdb=4E^M|Y%CCN&*|(Mn>5@sI%NFGIz)^d@@`;rXt?7kf4xwD zc#(K?alg4+bvLx}>&Wnk>#ee^yI$~m*1W8{t-6Zj*o(2K zzIE3cncgtzq3~^2;iSClqM*T!IqGApZwHoxE%YS4@Y5{uPIz2S( z8Jhy~*t;{e7N$0iJ+37c53~d8^@fQrO7l8J8=~I>+JD|wxuieo64F_`DfoxNNNRx2jKtL{GTcO$Bl!7eW)$jtS*zW=Y& ze<$?+f`M9E!H7Yx7+~7*#1X=H2^wfJ!Ubf!)-#a97-FT_*|`9ow{m zLQ)07QW~9(C+F`NUYE>4O~J5tZ8arT?mdQ;aX(>^LP=t-o2|R4?>3|4iYvLm0#eou6Pj!Q_k41i$~OTY~M!B1u=n z@8yu_{Njm&8k78psz1c}F48$rai~KeL3oHj{R@kf)>_QQSdCv z4**PjN`%kh*|iSGRY4HUj6^LEIj{9E@)L-C$}q7LJl&Qx5$(@NR(>eoo9yzF5vCq@mW#W-^n}RiA`K* z9)xYaPkPnCWb|onszw?q z_@w*D{%YgK`vSfDN)nG2jR6pdX9t7tPK9XXerlC+1wi@W=D&g0Ml^>k^<)|uChkhF zr&OlC6hXj<@^5Buq#?3{CqYV!)gI`LY^fui`;2H8&e6X zSG4s&_e^14jo?jM#O)!lTZi?qqqrsd==O^F`bEG$Yrx`C_mS|Gvwz$t^@;BWd#JDSHUN56x%O{!ACC8=ycw_a;$hZj@wI$LnCVOvQ1t$Xgkczy`m3ek zi{NS~a?Z*WHrPQ-4smW4*jl>+a4^|A2}5jzs}v7mjnO4c(DyXilIVfC9*nZNa_Rfn z`nd2&@E$8183NbEIG(_IlfpjgI!c^^qK%1fioZy^*mJ752z1K2$wq8F6yG`?wbnRa z|K09GxybaQ4`hKz;bn1G1cA{H|GJiA+LuxOHo59^xQAqkfiKw(eH-eJJU*-) z=zi`yj9ZKlegF^&1Q>Q#?QCp6WXu1SW}tHttd`Q865I6FX$&blwcr1~(g06o*H+>fhb4s8#A$u|_B|kJ zl~Gc@vHYC14b%QbVy3Kt7=vy&6d@#z?0UIW-_)n=BIN4MADzQ`p|SZX5))ty_hiq| zUdqpZddYmz`6sxhR=Q9GC+=A`Orx3H^v36<>|@(t^(;7NZ)it9wMV$2QGs9US`kSm zFwew8@W3td=11M_m(99FPb9%%A5aQP!Yh1Bj3+#yu%t3^<*#Ksp_shRyov32x){YT zYiGh1lf+X?5%r1rg?K4mDW5vTWg$d7Vc3d-6TO8WU-I4;9-(h(?=OU2XfMgqMgAWE zOF*>051`*dum22}VxJ@s16+iN&qfGNAw@i4{-pn_>%0G=q_{+J;_>7 zn7yCb%S^K`NO<%)be3HRrCtsE$&E`Pr)_8e+QCo1k+~0Y*o-PsC0>VDqh^SihrH9< zpym$%FA}ELe@q{dc1aWHM|dH&pl5)4*#V1pNR^rM0Qne-gT(RRY zE(U5kFWo6UBz;8snDm>{AIgf*6)3(#`t^-=TyaL4QMB!p~0UK9sB{T=IYB{K%)5k7kd@Yz#Pr&rM%z&WOAz4CDl zZie1lkN!f&GL%q`I`MIk$tO@1NXlmRMfBe&1k$w;#^`;Jt_NsChdiiC`diGP{LG^1 zN@jq4e;Qjs8tQmYEB=Jqo<6Q+hv0-vmeo3uBS2lrD#Q z{}LqGkI=~UDtwo`nSGgkS283tE?*|p*UhP|sjjN5C@U=~E-FkFB=ZyTSY9*|4g~{# z-sknWT~3GHX0@12MgynUX*FtxtCwO$G{&i7C-{!&N*Ap1W8DTt853?%0GT2!0N=UamO_z#
XG_yb9c(X%2Sr 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 gNEG8=KRmH=_k6m5!53Zq~s~(ZU=(Ouzs7@|T~c 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⋘yJwQWub0ulZ#K^gMoL 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

J9jkTFwcGDMP@49Ae;e!cJg-TQXjweI=ryFO>{ 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 MouD92U6Jm;00U#-B>(^b diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt index 992e70b27c..f9c531e745 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/LICENSE.txt @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp index 66a03716b9..7d12c713a4 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/baseiids.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h index 7b47a11de8..5a531e93d3 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/classfactoryhelpers.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp index 59f623892d..83866ea9bb 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -529,12 +529,10 @@ int8* Buffer::operator + (uint32 i) { if (i < memSize) return buffer + i; - else - { - static int8 eof; - eof = 0; - return &eof; - } + + static int8 eof; + eof = 0; + return &eof; } //------------------------------------------------------------------------------------- diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h index a6e37ad0b9..0a8c1ff6b5 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fcommandline.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fcommandline.h index f72ffd7f4c..653fb7c629 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fcommandline.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fcommandline.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp index b1d1dccdcb..9fe27d85aa 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.cpp @@ -11,7 +11,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h index 6bf2062023..3b376ae642 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fdebug.h @@ -11,7 +11,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -97,6 +97,10 @@ bool AmIBeingDebugged (); if (!(f)) \ FDebugBreak ("%s(%d) : Assert failed: %s\n", __FILE__, __LINE__, #f); +#define SMTG_ASSERT_MSG(f, msg) \ + if (!(f)) \ + FDebugBreak ("%s(%d) : Assert failed: [%s] [%s]\n", __FILE__, __LINE__, #f, msg); + /** Send "comment" string to the debugger for display. */ #define SMTG_WARNING(comment) FDebugPrint ("%s(%d) : %s\n", __FILE__, __LINE__, comment); @@ -194,6 +198,7 @@ void* operator new (size_t, int, const char*, int); #else /** if DEVELOPMENT is not set, these macros will do nothing. */ #define SMTG_ASSERT(f) +#define SMTG_ASSERT_MSG(f, msg) #define SMTG_WARNING(s) #define SMTG_PRINTSYSERROR #define SMTG_DEBUGSTR(s) diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp index 6e3c9278d6..a061556b92 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp @@ -10,7 +10,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h index 31254dc92f..4165a7b400 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -350,7 +350,7 @@ namespace Singleton { virtual Steinberg::FClassID isA () const SMTG_OVERRIDE {return className::getFClassID ();} \ virtual bool isA (Steinberg::FClassID s) const SMTG_OVERRIDE {return isTypeOf (s, false);} \ virtual bool isTypeOf (Steinberg::FClassID s, bool askBaseClass = true) const SMTG_OVERRIDE \ - { return (classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); } + { return (FObject::classIDsEqual (s, #className) ? true : (askBaseClass ? baseClass::isTypeOf (s, true) : false)); } //------------------------------------------------------------------------ /** Delegate refcount functions to BaseClass. diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp index 5540daa50a..524956b9ef 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -587,6 +587,9 @@ TSize FStreamer::writeString8 (const char8* ptr, bool terminate) //------------------------------------------------------------------------ TSize FStreamer::readString8 (char8* ptr, TSize size) { + if (size < 1 || ptr == nullptr) + return 0; + TSize i = 0; char8 c = 0; while (i < size) @@ -594,18 +597,19 @@ TSize FStreamer::readString8 (char8* ptr, TSize size) if (readRaw ((void*)&c, sizeof (char)) != sizeof (char)) break; ptr[i] = c; - i++; if (c == '\n' || c == '\0') break; + i++; } - if (c == '\n' && ptr[i - 2] == '\r') - ptr[i - 2] = 0; - if (i < size) - ptr[i] = 0; - else - ptr[size - 1] = 0; + // remove at end \n (LF) or \r\n (CR+LF) + if (c == '\n') + { + if (i > 0 && ptr[i - 1] == '\r') + i--; + } + ptr[i] = 0; - return strlen (ptr); + return i; } //------------------------------------------------------------------------ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h index 1c039ab232..8b97bb6cd1 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp index bd48a31b98..907baa7338 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -293,7 +293,7 @@ static inline int strnicmp16 (const Steinberg::char16* s1, const Steinberg::char //----------------------------------------------------------------------------- static inline int sprintf16 (Steinberg::char16* wcs, const Steinberg::char16* format, ...) { - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); return 0; } @@ -316,7 +316,7 @@ static inline int vsnwprintf (Steinberg::char16* wcs, size_t maxlen, //----------------------------------------------------------------------------- static inline Steinberg::char16* strrchr16 (const Steinberg::char16* str, Steinberg::char16 c) { - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); return nullptr; } @@ -667,7 +667,7 @@ int32 ConstString::compare (const ConstString& str, int32 n, CompareMode mode) c return 0; return 1; } - else if (isEmpty ()) + if (isEmpty ()) return -1; if (!isWide && !str.isWide) @@ -676,33 +676,23 @@ int32 ConstString::compare (const ConstString& str, int32 n, CompareMode mode) c { if (isCaseSensitive (mode)) return strcmp (*this, str); - else - return stricmp (*this, str); - } - else - { - if (isCaseSensitive (mode)) - return strncmp (*this, str, n); - else - return strnicmp (*this, str, n); + return stricmp (*this, str); } + if (isCaseSensitive (mode)) + return strncmp (*this, str, n); + return strnicmp (*this, str, n); } - else if (isWide && str.isWide) + if (isWide && str.isWide) { if (n < 0) { if (isCaseSensitive (mode)) return strcmp16 (*this, str); - else - return stricmp16 (*this, str); - } - else - { - if (isCaseSensitive (mode)) - return strncmp16 (*this, str, n); - else - return strnicmp16 (*this, str, n); + return stricmp16 (*this, str); } + if (isCaseSensitive (mode)) + return strncmp16 (*this, str, n); + return strnicmp16 (*this, str, n); } return compareAt (0, str, n, mode); } @@ -725,7 +715,7 @@ int32 ConstString::compareAt (uint32 index, const ConstString& str, int32 n, Com return 0; return 1; } - else if (isEmpty ()) + if (isEmpty ()) return -1; if (!isWide && !str.isWide) @@ -746,18 +736,13 @@ int32 ConstString::compareAt (uint32 index, const ConstString& str, int32 n, Com { if (isCaseSensitive (mode)) return strcmp (toCompare, str); - else - return stricmp (toCompare, str); - } - else - { - if (isCaseSensitive (mode)) - return strncmp (toCompare, str, n); - else - return strnicmp (toCompare, str, n); + return stricmp (toCompare, str); } + if (isCaseSensitive (mode)) + return strncmp (toCompare, str, n); + return strnicmp (toCompare, str, n); } - else if (isWide && str.isWide) + if (isWide && str.isWide) { char16* toCompare = buffer16; if (index > 0) @@ -775,34 +760,25 @@ int32 ConstString::compareAt (uint32 index, const ConstString& str, int32 n, Com { if (isCaseSensitive (mode)) return strcmp16 (toCompare, str.text16 ()); - else - return stricmp16 (toCompare, str.text16 ()); - } - else - { - if (isCaseSensitive (mode)) - return strncmp16 (toCompare, str.text16 (), n); - else - return strnicmp16 (toCompare, str.text16 (), n); + return stricmp16 (toCompare, str.text16 ()); } + if (isCaseSensitive (mode)) + return strncmp16 (toCompare, str.text16 (), n); + return strnicmp16 (toCompare, str.text16 (), n); } - else + + if (isWide) { - if (isWide) - { - String tmp (str.text8 ()); - if (tmp.toWideString () == false) - return -1; - return compareAt (index, tmp, n, mode); - } - else - { - String tmp (text8 ()); - if (tmp.toWideString () == false) - return 1; - return tmp.compareAt (index, str, n, mode); - } + String tmp (str.text8 ()); + if (tmp.toWideString () == false) + return -1; + return compareAt (index, tmp, n, mode); } + + String tmp (text8 ()); + if (tmp.toWideString () == false) + return 1; + return tmp.compareAt (index, str, n, mode); } //------------------------------------------------------------------------ @@ -814,28 +790,23 @@ Steinberg::int32 ConstString::naturalCompare (const ConstString& str, CompareMod return 0; return 1; } - else if (isEmpty ()) + if (isEmpty ()) return -1; if (!isWide && !str.isWide) return strnatcmp8 (buffer8, str.text8 (), isCaseSensitive (mode)); - else if (isWide && str.isWide) + if (isWide && str.isWide) return strnatcmp16 (buffer16, str.text16 (), isCaseSensitive (mode)); - else + + if (isWide) { - if (isWide) - { - String tmp (str.text8 ()); - tmp.toWideString (); - return strnatcmp16 (buffer16, tmp.text16 (), isCaseSensitive (mode)); - } - else - { - String tmp (text8 ()); - tmp.toWideString (); - return strnatcmp16 (tmp.text16 (), str.text16 (), isCaseSensitive (mode)); - } + String tmp (str.text8 ()); + tmp.toWideString (); + return strnatcmp16 (buffer16, tmp.text16 (), isCaseSensitive (mode)); } + String tmp (text8 ()); + tmp.toWideString (); + return strnatcmp16 (tmp.text16 (), str.text16 (), isCaseSensitive (mode)); } //----------------------------------------------------------------------------- @@ -845,7 +816,7 @@ bool ConstString::startsWith (const ConstString& str, CompareMode mode /*= kCase { return isEmpty (); } - else if (isEmpty ()) + if (isEmpty ()) { return false; } @@ -859,13 +830,13 @@ bool ConstString::startsWith (const ConstString& str, CompareMode mode /*= kCase return strncmp (buffer8, str.buffer8, str.length ()) == 0; return strnicmp (buffer8, str.buffer8, str.length ()) == 0; } - else if (isWide && str.isWide) + if (isWide && str.isWide) { if (isCaseSensitive (mode)) return strncmp16 (buffer16, str.buffer16, str.length ()) == 0; return strnicmp16 (buffer16, str.buffer16, str.length ()) == 0; } - else if (isWide) + if (isWide) { String tmp (str.text8 ()); tmp.toWideString (); @@ -875,16 +846,13 @@ bool ConstString::startsWith (const ConstString& str, CompareMode mode /*= kCase return strncmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0; return strnicmp16 (buffer16, tmp.buffer16, tmp.length ()) == 0; } - else - { - String tmp (text8 ()); - tmp.toWideString (); - if (str.length () > tmp.length ()) - return false; - if (isCaseSensitive (mode)) - return strncmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0; - return strnicmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0; - } + String tmp (text8 ()); + tmp.toWideString (); + if (str.length () > tmp.length ()) + return false; + if (isCaseSensitive (mode)) + return strncmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0; + return strnicmp16 (tmp.buffer16, str.buffer16, str.length ()) == 0; } //----------------------------------------------------------------------------- @@ -894,7 +862,7 @@ bool ConstString::endsWith (const ConstString& str, CompareMode mode /*= kCaseSe { return isEmpty (); } - else if (isEmpty ()) + if (isEmpty ()) { return false; } @@ -908,13 +876,13 @@ bool ConstString::endsWith (const ConstString& str, CompareMode mode /*= kCaseSe return strncmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0; return strnicmp (buffer8 + (length () - str.length ()), str.buffer8, str.length ()) == 0; } - else if (isWide && str.isWide) + if (isWide && str.isWide) { if (isCaseSensitive (mode)) return strncmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0; return strnicmp16 (buffer16 + (length () - str.length ()), str.buffer16, str.length ()) == 0; } - else if (isWide) + if (isWide) { String tmp (str.text8 ()); tmp.toWideString (); @@ -924,16 +892,13 @@ bool ConstString::endsWith (const ConstString& str, CompareMode mode /*= kCaseSe return strncmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0; return strnicmp16 (buffer16 + (length () - tmp.length ()), tmp.buffer16, tmp.length ()) == 0; } - else - { - String tmp (text8 ()); - tmp.toWideString (); - if (str.length () > tmp.length ()) - return false; - if (isCaseSensitive (mode)) - return strncmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0; - return strnicmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0; - } + String tmp (text8 ()); + tmp.toWideString (); + if (str.length () > tmp.length ()) + return false; + if (isCaseSensitive (mode)) + return strncmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0; + return strnicmp16 (tmp.buffer16 + (tmp.length () - str.length ()), str.buffer16, str.length ()) == 0; } //----------------------------------------------------------------------------- @@ -976,7 +941,7 @@ int32 ConstString::findNext (int32 startIndex, const ConstString& str, int32 n, } return -1; } - else if (!isWide && !str.isWide) + if (!isWide && !str.isWide) { uint32 stringLength = str.length (); n = n < 0 ? stringLength : Min (n, stringLength); @@ -1207,7 +1172,7 @@ int32 ConstString::findPrev (int32 startIndex, const ConstString& str, int32 n, } return -1; } - else if (!isWide && !str.isWide) + if (!isWide && !str.isWide) { uint32 stringLength = str.length (); n = n < 0 ? stringLength : Min (n, stringLength); @@ -1313,13 +1278,11 @@ int32 ConstString::getFirstDifferent (const ConstString& str, CompareMode mode) return -1; return getFirstDifferent (tmp, mode); } - else - { - String tmp (text8 ()); - if (tmp.toWideString () == false) - return -1; - return tmp.getFirstDifferent (str, mode); - } + + String tmp (text8 ()); + if (tmp.toWideString () == false) + return -1; + return tmp.getFirstDifferent (str, mode); } uint32 len1 = len; @@ -1375,8 +1338,7 @@ bool ConstString::scanInt64 (int64& value, uint32 offset, bool scanToEnd) const if (isWide) return scanInt64_16 (buffer16 + offset, value, scanToEnd); - else - return scanInt64_8 (buffer8 + offset, value, scanToEnd); + return scanInt64_8 (buffer8 + offset, value, scanToEnd); } //----------------------------------------------------------------------------- @@ -1387,8 +1349,7 @@ bool ConstString::scanUInt64 (uint64& value, uint32 offset, bool scanToEnd) cons if (isWide) return scanUInt64_16 (buffer16 + offset, value, scanToEnd); - else - return scanUInt64_8 (buffer8 + offset, value, scanToEnd); + return scanUInt64_8 (buffer8 + offset, value, scanToEnd); } //----------------------------------------------------------------------------- @@ -1399,8 +1360,7 @@ bool ConstString::scanHex (uint8& value, uint32 offset, bool scanToEnd) const if (isWide) return scanHex_16 (buffer16 + offset, value, scanToEnd); - else - return scanHex_8 (buffer8 + offset, value, scanToEnd); + return scanHex_8 (buffer8 + offset, value, scanToEnd); } //----------------------------------------------------------------------------- @@ -1411,8 +1371,7 @@ bool ConstString::scanInt32 (int32& value, uint32 offset, bool scanToEnd) const if (isWide) return scanInt32_16 (buffer16 + offset, value, scanToEnd); - else - return scanInt32_8 (buffer8 + offset, value, scanToEnd); + return scanInt32_8 (buffer8 + offset, value, scanToEnd); } //----------------------------------------------------------------------------- @@ -1423,8 +1382,7 @@ bool ConstString::scanUInt32 (uint32& value, uint32 offset, bool scanToEnd) cons if (isWide) return scanUInt32_16 (buffer16 + offset, value, scanToEnd); - else - return scanUInt32_8 (buffer8 + offset, value, scanToEnd); + return scanUInt32_8 (buffer8 + offset, value, scanToEnd); } //----------------------------------------------------------------------------- @@ -1434,7 +1392,7 @@ bool ConstString::scanInt64_8 (const char8* text, int64& value, bool scanToEnd) { if (sscanf (text, "%" FORMAT_INT64A, &value) == 1) return true; - else if (scanToEnd == false) + if (scanToEnd == false) return false; text++; } @@ -1460,7 +1418,7 @@ bool ConstString::scanUInt64_8 (const char8* text, uint64& value, bool scanToEnd { if (sscanf (text, "%" FORMAT_UINT64A, &value) == 1) return true; - else if (scanToEnd == false) + if (scanToEnd == false) return false; text++; } @@ -1510,7 +1468,7 @@ bool ConstString::scanHex_8 (const char8* text, uint8& value, bool scanToEnd) value = (uint8)v; return true; } - else if (scanToEnd == false) + if (scanToEnd == false) return false; text++; } @@ -1565,7 +1523,7 @@ bool ConstString::scanFloat (double& value, uint32 offset, bool scanToEnd) const { if (sscanf (txt, "%lf", &value) == 1) return true; - else if (scanToEnd == false) + if (scanToEnd == false) return false; txt++; } @@ -1593,7 +1551,7 @@ char16 ConstString::toLower (char16 c) } return c; #elif SMTG_OS_LINUX - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); return c; #else return towlower (c); @@ -1621,7 +1579,7 @@ char16 ConstString::toUpper (char16 c) } return c; #elif SMTG_OS_LINUX - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); return c; #else return towupper (c); @@ -1767,8 +1725,7 @@ bool ConstString::isDigit (uint32 index) const if (isWide) return ConstString::isCharDigit (buffer16[index]); - else - return ConstString::isCharDigit (buffer8[index]); + return ConstString::isCharDigit (buffer8[index]); } //----------------------------------------------------------------------------- @@ -1919,7 +1876,7 @@ int32 ConstString::multiByteToWideString (char16* dest, const char8* source, int } else { - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); } #endif @@ -1999,13 +1956,12 @@ int32 ConstString::wideStringToMultiByte (char8* dest, const char16* wideString, } else { - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); } return result; #else -#warning DEPRECATED No Linux implementation - assert(false && "DEPRECATED No Linux implementation"); + assert (false && "DEPRECATED No Linux implementation"); return 0; #endif @@ -2445,12 +2401,10 @@ bool String::setChar8 (uint32 index, char8 c) len = index; return true; } - else - { - if (resize (index + 1, isWide, true) == false) - return false; - len = index + 1; - } + + if (resize (index + 1, isWide, true) == false) + return false; + len = index + 1; } if (index < len && buffer) @@ -2497,12 +2451,9 @@ bool String::setChar16 (uint32 index, char16 c) len = index; return true; } - else - { - if (resize (index + 1, isWide, true) == false) - return false; - len = index + 1; - } + if (resize (index + 1, isWide, true) == false) + return false; + len = index + 1; } if (index < len && buffer) @@ -2536,8 +2487,7 @@ String& String::assign (const ConstString& str, int32 n) { if (str.isWideString ()) return assign (str.text16 (), n < 0 ? str.length () : n); - else - return assign (str.text8 (), n < 0 ? str.length () : n); + return assign (str.text8 (), n < 0 ? str.length () : n); } //----------------------------------------------------------------------------- @@ -2633,8 +2583,7 @@ String& String::append (const ConstString& str, int32 n) { if (str.isWideString ()) return append (str.text16 (), n); - else - return append (str.text8 (), n); + return append (str.text8 (), n); } //----------------------------------------------------------------------------- @@ -2718,7 +2667,7 @@ String& String::append (const char8 c, int32 n) { return append (str, 1); } - else if (n > 1) + if (n > 1) { if (isWide) { @@ -2752,7 +2701,7 @@ String& String::append (const char16 c, int32 n) char16 str[] = {c, 0}; return append (str, 1); } - else if (n > 1) + if (n > 1) { if (!isWide) { @@ -2781,8 +2730,7 @@ String& String::insertAt (uint32 idx, const ConstString& str, int32 n) { if (str.isWideString ()) return insertAt (idx, str.text16 (), n); - else - return insertAt (idx, str.text8 (), n); + return insertAt (idx, str.text8 (), n); } //----------------------------------------------------------------------------- @@ -2860,8 +2808,7 @@ String& String::replace (uint32 idx, int32 n1, const ConstString& str, int32 n2) { if (str.isWideString ()) return replace (idx, n1, str.text16 (), n2); - else - return replace (idx, n1, str.text8 (), n2); + return replace (idx, n1, str.text8 (), n2); } // "replace" replaces n1 number of characters at the specified index with @@ -3749,11 +3696,9 @@ unsigned char* String::toPascalString (unsigned char* buf) } return buf; } - else - { - *buf = 0; - return buf; - } + + *buf = 0; + return buf; } //----------------------------------------------------------------------------- @@ -3852,7 +3797,7 @@ void* ConstString::toCFStringRef (uint32 encoding, bool mutableCFString) const return (void*)CFStringCreateWithCString (kCFAllocator, "", encoding); } } - return 0; + return nullptr; } #endif @@ -3886,9 +3831,9 @@ template int32 tstrnatcmp (const T* s1, const T* s2, bool caseSensitiv { if (s1 == nullptr && s2 == nullptr) return 0; - else if (s1 == nullptr) + if (s1 == nullptr) return -1; - else if (s2 == nullptr) + if (s2 == nullptr) return 1; while (*s1 && *s2) @@ -3949,12 +3894,11 @@ template int32 tstrnatcmp (const T* s1, const T* s2, bool caseSensitiv if (*s1 == 0 && *s2 == 0) return 0; - else if (*s1 == 0) + if (*s1 == 0) return -1; - else if (*s2 == 0) + if (*s2 == 0) return 1; - else - return (int32)(*s1 - *s2); + return (int32)(*s1 - *s2); } //------------------------------------------------------------------------ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h index 399f2d1af2..7fc758aa77 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -322,7 +322,7 @@ public: String (const ConstString& str, int32 n = -1); ///< assign n characters of str (-1: all) String (const FVariant& var); ///< assign from FVariant String (IString* str); ///< assign from IString - ~String (); + ~String () SMTG_OVERRIDE; #if SMTG_CPP11_STDLIBSUPPORT String (String&& str); diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp index 65f8d68964..f4ac80cc57 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h index a097262336..e85a9bbcc3 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -78,7 +78,7 @@ class UpdateHandler : public FObject, public IUpdateHandler, public IUpdateManag public: //------------------------------------------------------------------------------ UpdateHandler (); - ~UpdateHandler (); + ~UpdateHandler () SMTG_OVERRIDE; using FObject::addDependent; using FObject::removeDependent; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h index 59196ed709..2ef35ba8d8 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/include/flock.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -99,7 +99,7 @@ public: FLock (const char8* name = "FLock"); /** Lock destructor. */ - ~FLock (); + ~FLock () SMTG_OVERRIDE; //-- ILock ----------------------------------------------------------- void lock () SMTG_OVERRIDE; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp index 5484b801bb..e7c154bad7 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/thread/source/flock.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt index 1a0ce5736d..6daa072e68 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- This license applies only to files referencing this license, for other files of the Software Development Kit the respective embedded license text diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h index 7f267dc6b4..49eb5736de 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/falignpush.h @@ -9,7 +9,7 @@ //----------------------------------------------------------------------------- // This file is part of a Steinberg SDK. It is subject to the license terms // in the LICENSE file found in the top-level directory of this distribution -// and at www.steinberg.net/sdklicenses. +// and at www.steinberg.net/sdklicenses. // No part of the SDK, including this file, may be copied, modified, propagated, // or distributed except according to the terms contained in the LICENSE file. //----------------------------------------------------------------------------- @@ -26,11 +26,10 @@ #elif defined __BORLANDC__ #pragma -a8 #elif SMTG_OS_WINDOWS - //! @brief warning C4996: alignment changed after including header, may be due to missing #pragma pack(pop) - #if defined (_MSC_VER) + //! @brief warning C4103: alignment changed after including header, may be due to missing #pragma pack(pop) + #ifdef _MSC_VER #pragma warning(disable : 4103) #endif - #pragma pack(push) #if SMTG_PLATFORM_64 #pragma pack(16) diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h index f6a10989f1..7b4a78d27a 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h @@ -71,6 +71,8 @@ #define SMTG_CPU_ARM_64EC 0 #endif + #define SMTG_OS_WINDOWS_ARM (SMTG_CPU_ARM_64EC || SMTG_CPU_ARM_64 || SMTG_CPU_ARM) + #define BYTEORDER kLittleEndian #define COM_COMPATIBLE 1 @@ -85,12 +87,12 @@ #endif #ifdef _MSC_VER - #pragma warning (disable : 4244) // Conversion from 'type1' to 'type2', possible loss of data. - #pragma warning (disable : 4250) // Inheritance via dominance is allowed - #pragma warning (disable : 4996) // deprecated functions + #pragma warning (disable : 4244) //! @brief warning C4244: Conversion from 'type1' to 'type2', possible loss of data. + #pragma warning (disable : 4250) //! @brief warning C4250: Inheritance via dominance is allowed + #pragma warning (disable : 4996) //! @brief warning C4996: deprecated functions - #pragma warning (3 : 4189) // local variable is initialized but not referenced - #pragma warning (3 : 4238) // nonstandard extension used : class rvalue used as lvalue + #pragma warning (3 : 4189) //! @brief warning C4189: local variable is initialized but not referenced + #pragma warning (3 : 4238) //! @brief warning C4238: nonstandard extension used : class rvalue used as lvalue #endif #if defined (_WIN64) || defined (_M_ARM64) @@ -104,56 +106,35 @@ #endif #ifdef __cplusplus - #if __cplusplus >= 201103L || _MSC_VER > 1600 || SMTG_INTEL_CXX11_MODE - #define SMTG_CPP11 1 - #else - #define SMTG_CPP11 0 - #endif - + #define SMTG_CPP11 (__cplusplus >= 201103L || _MSC_VER > 1600 || SMTG_INTEL_CXX11_MODE) #define SMTG_CPP11_STDLIBSUPPORT SMTG_CPP11 - - #if (__cplusplus >= 201402L || (defined (_MSVC_LANG) && _MSVC_LANG >= 201402L)) - #define SMTG_CPP14 1 - #else - #define SMTG_CPP14 0 - #endif - - #if (__cplusplus >= 201703L || (defined (_MSVC_LANG) && _MSVC_LANG >= 201703L)) - #define SMTG_CPP17 1 - #else - #define SMTG_CPP17 0 - #endif - - #if (_MSC_FULL_VER >= 190023026 || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1300)) - #define SMTG_HAS_NOEXCEPT 1 - #else - #define SMTG_HAS_NOEXCEPT 0 - #endif - - #if (_MSC_FULL_VER >= 190024210L || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1500) || (defined(__MINGW32__) && SMTG_CPP11)) + #define SMTG_CPP14 (__cplusplus >= 201402L || ((_MSC_FULL_VER >= 190024210L) && (_MSVC_LANG >= 201402L))) + #define SMTG_CPP17 (__cplusplus >= 201703L || ((_MSC_FULL_VER >= 190024210L) && (_MSVC_LANG >= 201703L))) + #define SMTG_CPP20 (__cplusplus >= 202002L) + #define SMTG_HAS_NOEXCEPT ((_MSC_FULL_VER >= 190023026L) || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1300)) + #if ((_MSC_FULL_VER >= 190024210L) || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER >= 1500) || (defined(__MINGW32__) && SMTG_CPP11)) #define SMTG_HAS_CPP11_CONSTEXPR 1 #else #define SMTG_HAS_CPP11_CONSTEXPR 0 #endif - #if (((_MSC_VER >= 1915L) && (_MSVC_LANG >= 201402L)) || (SMTG_INTEL_CXX11_MODE && SMTG_INTEL_COMPILER > 1700) || (defined(__MINGW32__) && SMTG_CPP14)) #define SMTG_HAS_CPP14_CONSTEXPR 1 #else #define SMTG_HAS_CPP14_CONSTEXPR 0 #endif - - #endif + #endif //__cplusplus #define SMTG_DEPRECATED_ATTRIBUTE(message) __declspec (deprecated ("Is Deprecated: " message)) //----------------------------------------------------------------------------- // LINUX //----------------------------------------------------------------------------- #elif __gnu_linux__ || __linux__ - #define SMTG_OS_LINUX 1 - #define SMTG_OS_MACOS 0 - #define SMTG_OS_WINDOWS 0 - #define SMTG_OS_IOS 0 - #define SMTG_OS_OSX 0 + #define SMTG_OS_LINUX 1 + #define SMTG_OS_MACOS 0 + #define SMTG_OS_WINDOWS 0 + #define SMTG_OS_WINDOWS_ARM 0 + #define SMTG_OS_IOS 0 + #define SMTG_OS_OSX 0 #define SMTG_CPU_X86 __i386__ #define SMTG_CPU_X86_64 __x86_64__ @@ -196,6 +177,7 @@ #endif #define SMTG_CPP14 (__cplusplus >= 201402L) #define SMTG_CPP17 (__cplusplus >= 201703L) + #define SMTG_CPP20 (__cplusplus >= 202002L) #if defined(__GNUG__) && __GNUG__ < 8 #define SMTG_CPP11_STDLIBSUPPORT 0 #else @@ -204,23 +186,24 @@ #define SMTG_HAS_NOEXCEPT 1 #define SMTG_HAS_CPP11_CONSTEXPR SMTG_CPP11 #define SMTG_HAS_CPP14_CONSTEXPR SMTG_CPP14 - #endif + #endif // __cplusplus //----------------------------------------------------------------------------- // Mac and iOS //----------------------------------------------------------------------------- #elif __APPLE__ #include - #define SMTG_OS_LINUX 0 - #define SMTG_OS_MACOS 1 - #define SMTG_OS_WINDOWS 0 - #define SMTG_OS_IOS TARGET_OS_IPHONE - #define SMTG_OS_OSX TARGET_OS_MAC && !TARGET_OS_IPHONE - - #define SMTG_CPU_X86 TARGET_CPU_X86 - #define SMTG_CPU_X86_64 TARGET_CPU_X86_64 - #define SMTG_CPU_ARM TARGET_CPU_ARM - #define SMTG_CPU_ARM_64 TARGET_CPU_ARM64 - #define SMTG_CPU_ARM_64EC 0 + #define SMTG_OS_LINUX 0 + #define SMTG_OS_MACOS 1 + #define SMTG_OS_WINDOWS 0 + #define SMTG_OS_WINDOWS_ARM 0 + #define SMTG_OS_IOS TARGET_OS_IPHONE + #define SMTG_OS_OSX TARGET_OS_MAC && !TARGET_OS_IPHONE + + #define SMTG_CPU_X86 TARGET_CPU_X86 + #define SMTG_CPU_X86_64 TARGET_CPU_X86_64 + #define SMTG_CPU_ARM TARGET_CPU_ARM + #define SMTG_CPU_ARM_64 TARGET_CPU_ARM64 + #define SMTG_CPU_ARM_64EC 0 #if !SMTG_OS_IOS #ifndef __CF_USE_FRAMEWORK_INCLUDES__ @@ -274,6 +257,7 @@ #define SMTG_CPP11 (__cplusplus >= 201103L || SMTG_INTEL_CXX11_MODE) #define SMTG_CPP14 (__cplusplus >= 201402L) #define SMTG_CPP17 (__cplusplus >= 201703L) + #define SMTG_CPP20 (__cplusplus >= 202002L) #if defined (_LIBCPP_VERSION) && SMTG_CPP11 #define SMTG_CPP11_STDLIBSUPPORT 1 #define SMTG_HAS_NOEXCEPT 1 @@ -283,7 +267,7 @@ #endif #define SMTG_HAS_CPP11_CONSTEXPR SMTG_CPP11 #define SMTG_HAS_CPP14_CONSTEXPR SMTG_CPP14 - #endif + #endif // __cplusplus //----------------------------------------------------------------------------- // Unknown Platform //----------------------------------------------------------------------------- @@ -291,13 +275,6 @@ #pragma error unknown platform #endif -//----------------------------------------------------------------------------- -#if SMTG_OS_WINDOWS && (SMTG_CPU_ARM_64EC || SMTG_CPU_ARM_64 || SMTG_CPU_ARM) -#define SMTG_OS_WINDOWS_ARM 1 -#else -#define SMTG_OS_WINDOWS_ARM 0 -#endif - //----------------------------------------------------------------------------- #if !SMTG_RENAME_ASSERT #undef WINDOWS diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h index 848e8eee4e..fea4522c56 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h @@ -133,12 +133,11 @@ inline SMTG_CONSTEXPR14 int32 _tstrcmp (const T* src, const T* dst) if (*src == 0 && *dst == 0) return 0; - else if (*src == 0) + if (*src == 0) return -1; - else if (*dst == 0) + if (*dst == 0) return 1; - else - return (int32) (*src - *dst); + return (int32) (*src - *dst); } inline SMTG_CONSTEXPR14 int32 tstrcmp (const tchar* src, const tchar* dst) {return _tstrcmp (src, dst);} @@ -169,12 +168,11 @@ inline SMTG_CONSTEXPR14 int32 _tstrncmp (const T* first, const T* last, uint32 c if (*first == 0 && *last == 0) return 0; - else if (*first == 0) + if (*first == 0) return -1; - else if (*last == 0) + if (*last == 0) return 1; - else - return (int32) (*first - *last); + return (int32) (*first - *last); } inline SMTG_CONSTEXPR14 int32 tstrncmp (const tchar* first, const tchar* last, uint32 count) {return _tstrncmp (first, last, count);} diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp index be555ee399..b88fc5bf9b 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp @@ -406,7 +406,7 @@ void FUID::toRegistryString (char8* string) const char8 s5[13]; Steinberg::toString8 (s5, data, 10, 16); - snprintf (string, 36, "{%s-%s-%s-%s-%s}", s1, s2, s3, s4, s5); + snprintf (string, 40, "{%s-%s-%s-%s-%s}", s1, s2, s3, s4, s5); #endif } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h index 5ce9e295a8..e5d8a5f3ab 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h @@ -27,34 +27,39 @@ inline const T& Min (const T& a, const T& b) return b < a ? b : a; } +//---------------------------------------------------------------------------- template inline const T& Max (const T& a, const T& b) { return a < b ? b : a; } +//---------------------------------------------------------------------------- template inline T Abs (const T& value) { return (value >= (T)0) ? value : -value; } +//---------------------------------------------------------------------------- template inline T Sign (const T& value) { return (value == (T)0) ? 0 : ((value >= (T)0) ? 1 : -1); } +//---------------------------------------------------------------------------- template inline T Bound (T minval, T maxval, T x) { if (x < minval) return minval; - else if (x > maxval) + if (x > maxval) return maxval; return x; } +//---------------------------------------------------------------------------- template void Swap (T& t1, T& t2) { @@ -63,6 +68,7 @@ void Swap (T& t1, T& t2) t2 = tmp; } +//---------------------------------------------------------------------------- template bool IsApproximateEqual (T t1, T t2, T epsilon) { @@ -76,18 +82,21 @@ bool IsApproximateEqual (T t1, T t2, T epsilon) return false; } +//---------------------------------------------------------------------------- template inline T ToNormalized (const T& value, const int32 numSteps) { return value / T (numSteps); } +//---------------------------------------------------------------------------- template inline int32 FromNormalized (const T& norm, const int32 numSteps) { return Min (numSteps, int32 (norm * (numSteps + 1))); } +//---------------------------------------------------------------------------- // Four character constant #ifndef CCONST #define CCONST(a, b, c, d) \ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h index 5e600d3d1c..7d4e68fb95 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstattributes.h @@ -106,7 +106,7 @@ tresult PLUGIN_API MyPlugin::setState (IBStream* state) UString128 tmp (string); char ascii[128]; tmp.toAscii (ascii, 128); - if (!strncmp (ascii, StateType::kProject, strlen (StateType::kProject))) + if (strncmp (ascii, StateType::kProject, strlen (StateType::kProject)) == 0) { // we are in project loading context... } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h index b8d78c614f..82d550e327 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstaudioprocessor.h @@ -46,25 +46,26 @@ namespace PlugType \defgroup plugType Plug-in Type used for subCategories */ /*@{*/ //------------------------------------------------------------------------ +SMTG_CONSTEXPR const CString kFx = "Fx"; ///< others type (not categorized) SMTG_CONSTEXPR const CString kFxAnalyzer = "Fx|Analyzer"; ///< Scope, FFT-Display, Loudness Processing... SMTG_CONSTEXPR const CString kFxDelay = "Fx|Delay"; ///< Delay, Multi-tap Delay, Ping-Pong Delay... SMTG_CONSTEXPR const CString kFxDistortion = "Fx|Distortion"; ///< Amp Simulator, Sub-Harmonic, SoftClipper... SMTG_CONSTEXPR const CString kFxDynamics = "Fx|Dynamics"; ///< Compressor, Expander, Gate, Limiter, Maximizer, Tape Simulator, EnvelopeShaper... SMTG_CONSTEXPR const CString kFxEQ = "Fx|EQ"; ///< Equalization, Graphical EQ... SMTG_CONSTEXPR const CString kFxFilter = "Fx|Filter"; ///< WahWah, ToneBooster, Specific Filter,... -SMTG_CONSTEXPR const CString kFx = "Fx"; ///< others type (not categorized) +SMTG_CONSTEXPR const CString kFxGenerator = "Fx|Generator"; ///< Tone Generator, Noise Generator... SMTG_CONSTEXPR const CString kFxInstrument = "Fx|Instrument"; ///< Fx which could be loaded as Instrument too SMTG_CONSTEXPR const CString kFxInstrumentExternal = "Fx|Instrument|External"; ///< Fx which could be loaded as Instrument too and is external (wrapped Hardware) -SMTG_CONSTEXPR const CString kFxSpatial = "Fx|Spatial"; ///< MonoToStereo, StereoEnhancer,... -SMTG_CONSTEXPR const CString kFxGenerator = "Fx|Generator"; ///< Tone Generator, Noise Generator... SMTG_CONSTEXPR const CString kFxMastering = "Fx|Mastering"; ///< Dither, Noise Shaping,... SMTG_CONSTEXPR const CString kFxModulation = "Fx|Modulation"; ///< Phaser, Flanger, Chorus, Tremolo, Vibrato, AutoPan, Rotary, Cloner... +SMTG_CONSTEXPR const CString kFxNetwork = "Fx|Network"; ///< using Network SMTG_CONSTEXPR const CString kFxPitchShift = "Fx|Pitch Shift"; ///< Pitch Processing, Pitch Correction, Vocal Tuning... SMTG_CONSTEXPR const CString kFxRestoration = "Fx|Restoration"; ///< Denoiser, Declicker,... SMTG_CONSTEXPR const CString kFxReverb = "Fx|Reverb"; ///< Reverberation, Room Simulation, Convolution Reverb... +SMTG_CONSTEXPR const CString kFxSpatial = "Fx|Spatial"; ///< MonoToStereo, StereoEnhancer,... SMTG_CONSTEXPR const CString kFxSurround = "Fx|Surround"; ///< dedicated to surround processing: LFE Splitter, Bass Manager... SMTG_CONSTEXPR const CString kFxTools = "Fx|Tools"; ///< Volume, Mixer, Tuner... -SMTG_CONSTEXPR const CString kFxNetwork = "Fx|Network"; ///< using Network +SMTG_CONSTEXPR const CString kFxVocals = "Fx|Vocals"; ///< Tools dedicated to vocals SMTG_CONSTEXPR const CString kInstrument = "Instrument"; ///< Effect used as instrument (sound generator), not as insert SMTG_CONSTEXPR const CString kInstrumentDrum = "Instrument|Drum"; ///< Instrument for Drum sounds @@ -74,16 +75,15 @@ SMTG_CONSTEXPR const CString kInstrumentSampler = "Instrument|Sampler"; ///< In SMTG_CONSTEXPR const CString kInstrumentSynth = "Instrument|Synth"; ///< Instrument based on Synthesis SMTG_CONSTEXPR const CString kInstrumentSynthSampler = "Instrument|Synth|Sampler"; ///< Instrument based on Synthesis and Samples +SMTG_CONSTEXPR const CString kAmbisonics = "Ambisonics"; ///< used for Ambisonics channel (FX or Panner/Mixconverter/Up-Mixer/Down-Mixer when combined with other category) +SMTG_CONSTEXPR const CString kAnalyzer = "Analyzer"; ///< Meter, Scope, FFT-Display, not selectable as insert plug-in +SMTG_CONSTEXPR const CString kNoOfflineProcess = "NoOfflineProcess"; ///< will be NOT used for plug-in offline processing (will work as normal insert plug-in) +SMTG_CONSTEXPR const CString kOnlyARA = "OnlyARA"; ///< used for plug-ins that require ARA to operate (will not work as normal insert plug-in) +SMTG_CONSTEXPR const CString kOnlyOfflineProcess = "OnlyOfflineProcess"; ///< used for plug-in offline processing (will not work as normal insert plug-in) +SMTG_CONSTEXPR const CString kOnlyRealTime = "OnlyRT"; ///< indicates that it supports only realtime process call, no processing faster than realtime SMTG_CONSTEXPR const CString kSpatial = "Spatial"; ///< used for SurroundPanner SMTG_CONSTEXPR const CString kSpatialFx = "Spatial|Fx"; ///< used for SurroundPanner and as insert effect -SMTG_CONSTEXPR const CString kOnlyRealTime = "OnlyRT"; ///< indicates that it supports only realtime process call, no processing faster than realtime -SMTG_CONSTEXPR const CString kOnlyOfflineProcess = "OnlyOfflineProcess"; ///< used for plug-in offline processing (will not work as normal insert plug-in) -SMTG_CONSTEXPR const CString kOnlyARA = "OnlyARA"; ///< used for plug-ins that require ARA to operate (will not work as normal insert plug-in) - -SMTG_CONSTEXPR const CString kNoOfflineProcess = "NoOfflineProcess"; ///< will be NOT used for plug-in offline processing (will work as normal insert plug-in) SMTG_CONSTEXPR const CString kUpDownMix = "Up-Downmix"; ///< used for Mixconverter/Up-Mixer/Down-Mixer -SMTG_CONSTEXPR const CString kAnalyzer = "Analyzer"; ///< Meter, Scope, FFT-Display, not selectable as insert plug-in -SMTG_CONSTEXPR const CString kAmbisonics = "Ambisonics"; ///< used for Ambisonics channel (FX or Panner/Mixconverter/Up-Mixer/Down-Mixer when combined with other category) SMTG_CONSTEXPR const CString kMono = "Mono"; ///< used for Mono only plug-in [optional] SMTG_CONSTEXPR const CString kStereo = "Stereo"; ///< used for Stereo only plug-in [optional] diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h index f979545ce9..0d21684fc1 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h @@ -76,6 +76,15 @@ const Speaker kSpeakerACN12 = (Speaker)1 << 46; ///< Ambisonic ACN 12 const Speaker kSpeakerACN13 = (Speaker)1 << 47; ///< Ambisonic ACN 13 const Speaker kSpeakerACN14 = (Speaker)1 << 48; ///< Ambisonic ACN 14 const Speaker kSpeakerACN15 = (Speaker)1 << 49; ///< Ambisonic ACN 15 +const Speaker kSpeakerACN16 = (Speaker)1 << 50; ///< Ambisonic ACN 16 +const Speaker kSpeakerACN17 = (Speaker)1 << 51; ///< Ambisonic ACN 17 +const Speaker kSpeakerACN18 = (Speaker)1 << 52; ///< Ambisonic ACN 18 +const Speaker kSpeakerACN19 = (Speaker)1 << 53; ///< Ambisonic ACN 19 +const Speaker kSpeakerACN20 = (Speaker)1 << 54; ///< Ambisonic ACN 20 +const Speaker kSpeakerACN21 = (Speaker)1 << 55; ///< Ambisonic ACN 21 +const Speaker kSpeakerACN22 = (Speaker)1 << 56; ///< Ambisonic ACN 22 +const Speaker kSpeakerACN23 = (Speaker)1 << 57; ///< Ambisonic ACN 23 +const Speaker kSpeakerACN24 = (Speaker)1 << 58; ///< Ambisonic ACN 24 const Speaker kSpeakerTsl = (Speaker)1 << 24; ///< Top Side Left (Tsl) const Speaker kSpeakerTsr = (Speaker)1 << 25; ///< Top Side Right (Tsr) @@ -103,6 +112,7 @@ namespace SpeakerArr { //------------------------------------------------------------------------ /** Speaker Arrangement Definitions. +* for example: 5.0.5.3 for 5x Middle + 0x LFE + 5x Top + 3x Bottom \ingroup speakerArrangements */ /*@{*/ const SpeakerArrangement kEmpty = 0; ///< empty arrangement @@ -116,45 +126,46 @@ const SpeakerArrangement kStereoTF = kSpeakerTfl | kSpeakerTfr; ///< Tfl Tfr const SpeakerArrangement kStereoTS = kSpeakerTsl | kSpeakerTsr; ///< Tsl Tsr const SpeakerArrangement kStereoTR = kSpeakerTrl | kSpeakerTrr; ///< Trl Trr const SpeakerArrangement kStereoBF = kSpeakerBfl | kSpeakerBfr; ///< Bfl Bfr -const SpeakerArrangement kCineFront = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLc | kSpeakerRc; ///< L R C Lc Rc +/** L R C Lc Rc */ +const SpeakerArrangement kCineFront = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLc | kSpeakerRc; -/** L R C */ +/** L R C */ // 3.0 const SpeakerArrangement k30Cine = kSpeakerL | kSpeakerR | kSpeakerC; -/** L R C Lfe */ -const SpeakerArrangement k31Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe; +/** L R C Lfe */ // 3.1 +const SpeakerArrangement k31Cine = k30Cine | kSpeakerLfe; /** L R S */ const SpeakerArrangement k30Music = kSpeakerL | kSpeakerR | kSpeakerCs; /** L R Lfe S */ -const SpeakerArrangement k31Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerCs; -/** L R C S (LCRS) */ +const SpeakerArrangement k31Music = k30Music | kSpeakerLfe; +/** L R C S */ // LCRS const SpeakerArrangement k40Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerCs; -/** L R C Lfe S (LCRS+Lfe) */ -const SpeakerArrangement k41Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerCs; -/** L R Ls Rs (Quadro) */ +/** L R C Lfe S */ // LCRS+Lfe +const SpeakerArrangement k41Cine = k40Cine | kSpeakerLfe; +/** L R Ls Rs */ // 4.0 (Quadro) const SpeakerArrangement k40Music = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs; -/** L R Lfe Ls Rs (Quadro+Lfe) */ -const SpeakerArrangement k41Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs; +/** L R Lfe Ls Rs */ // 4.1 (Quadro+Lfe) +const SpeakerArrangement k41Music = k40Music | kSpeakerLfe; /** L R C Ls Rs */ // 5.0 (ITU 0+5+0.0 Sound System B) const SpeakerArrangement k50 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs; /** L R C Lfe Ls Rs */ // 5.1 (ITU 0+5+0.1 Sound System B) -const SpeakerArrangement k51 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs; +const SpeakerArrangement k51 = k50 | kSpeakerLfe; /** L R C Ls Rs Cs */ const SpeakerArrangement k60Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerCs; /** L R C Lfe Ls Rs Cs */ -const SpeakerArrangement k61Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs; +const SpeakerArrangement k61Cine = k60Cine | kSpeakerLfe; /** L R Ls Rs Sl Sr */ const SpeakerArrangement k60Music = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr; /** L R Lfe Ls Rs Sl Sr */ -const SpeakerArrangement k61Music = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr; +const SpeakerArrangement k61Music = k60Music | kSpeakerLfe; /** L R C Ls Rs Lc Rc */ const SpeakerArrangement k70Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc; /** L R C Lfe Ls Rs Lc Rc */ -const SpeakerArrangement k71Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc; +const SpeakerArrangement k71Cine = k70Cine | kSpeakerLfe; const SpeakerArrangement k71CineFullFront = k71Cine; /** L R C Ls Rs Sl Sr */ // (ITU 0+7+0.0 Sound System I) const SpeakerArrangement k70Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr; /** L R C Lfe Ls Rs Sl Sr */ // (ITU 0+7+0.1 Sound System I) -const SpeakerArrangement k71Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr; +const SpeakerArrangement k71Music = k70Music | kSpeakerLfe; /** L R C Lfe Ls Rs Lcs Rcs */ const SpeakerArrangement k71CineFullRear = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLcs | kSpeakerRcs; @@ -165,31 +176,37 @@ const SpeakerArrangement k71Proximity = kSpeakerL | kSpeakerR | kSpeakerC | /** L R C Ls Rs Lc Rc Cs */ const SpeakerArrangement k80Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs; /** L R C Lfe Ls Rs Lc Rc Cs */ -const SpeakerArrangement k81Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs; +const SpeakerArrangement k81Cine = k80Cine | kSpeakerLfe; /** L R C Ls Rs Cs Sl Sr */ const SpeakerArrangement k80Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr; /** L R C Lfe Ls Rs Cs Sl Sr */ -const SpeakerArrangement k81Music = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerCs | kSpeakerSl | kSpeakerSr; +const SpeakerArrangement k81Music = k80Music | kSpeakerLfe; /** L R C Ls Rs Lc Rc Sl Sr */ const SpeakerArrangement k90Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerSl | kSpeakerSr; /** L R C Lfe Ls Rs Lc Rc Sl Sr */ -const SpeakerArrangement k91Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | - kSpeakerSl | kSpeakerSr; +const SpeakerArrangement k91Cine = k90Cine | kSpeakerLfe; /** L R C Ls Rs Lc Rc Cs Sl Sr */ const SpeakerArrangement k100Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs | kSpeakerSl | kSpeakerSr; /** L R C Lfe Ls Rs Lc Rc Cs Sl Sr */ -const SpeakerArrangement k101Cine = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerCs | - kSpeakerSl | kSpeakerSr; +const SpeakerArrangement k101Cine = k100Cine | kSpeakerLfe; -/** First-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */ +/** First-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (4 channels) */ const SpeakerArrangement kAmbi1stOrderACN = kSpeakerACN0 | kSpeakerACN1 | kSpeakerACN2 | kSpeakerACN3; -/** Second-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */ +/** Second-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (9 channels) */ const SpeakerArrangement kAmbi2cdOrderACN = kAmbi1stOrderACN | kSpeakerACN4 | kSpeakerACN5 | kSpeakerACN6 | kSpeakerACN7 | kSpeakerACN8; -/** Third-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization */ +/** Third-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (16 channels) */ const SpeakerArrangement kAmbi3rdOrderACN = kAmbi2cdOrderACN | kSpeakerACN9 | kSpeakerACN10 | kSpeakerACN11 | kSpeakerACN12 | kSpeakerACN13 | kSpeakerACN14 | kSpeakerACN15; - +/** Fourth-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (25 channels) */ +const SpeakerArrangement kAmbi4thOrderACN = kAmbi3rdOrderACN | kSpeakerACN16 | kSpeakerACN17 | kSpeakerACN18 | kSpeakerACN19 | kSpeakerACN20 | + kSpeakerACN21 | kSpeakerACN22 | kSpeakerACN23 | kSpeakerACN24; +/** Fifth-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (36 channels) */ +const SpeakerArrangement kAmbi5thOrderACN = 0x000FFFFFFFFF; +/** Sixth-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (49 channels) */ +const SpeakerArrangement kAmbi6thOrderACN = 0x0001FFFFFFFFFFFF; +/** Seventh-Order with Ambisonic Channel Number (ACN) ordering and SN3D normalization (64 channels) */ +const SpeakerArrangement kAmbi7thOrderACN = 0xFFFFFFFFFFFFFFFF; /*-----------*/ /* 3D formats */ @@ -210,12 +227,17 @@ const SpeakerArrangement k70MPEG3D = k70CineFrontHigh; const SpeakerArrangement k50_2 = k70CineFrontHigh; /** L R C Lfe Ls Rs Tfl Tfr */ // 5.1.2 (ITU 2+5+0.1 Sound System C) -const SpeakerArrangement k71CineFrontHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTfl | kSpeakerTfr; +const SpeakerArrangement k71CineFrontHigh = k70CineFrontHigh | kSpeakerLfe; const SpeakerArrangement k71MPEG3D = k71CineFrontHigh; const SpeakerArrangement k51_2 = k71CineFrontHigh; +/** L R C Ls Rs Tsl Tsr */ // 5.0.2 (Side) +const SpeakerArrangement k70CineSideHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerTsl | kSpeakerTsr; +const SpeakerArrangement k50_2_TS = k70CineSideHigh; + /** L R C Lfe Ls Rs Tsl Tsr */ // 5.1.2 (Side) -const SpeakerArrangement k71CineSideHigh = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTsl | kSpeakerTsr; +const SpeakerArrangement k71CineSideHigh = k70CineSideHigh | kSpeakerLfe; +const SpeakerArrangement k51_2_TS = k71CineSideHigh; /** L R Lfe Ls Rs Tfl Tfc Tfr Bfc */ // 4.1.3.1 const SpeakerArrangement k81MPEG3D = kSpeakerL | kSpeakerR | kSpeakerLfe | kSpeakerLs | kSpeakerRs | @@ -228,25 +250,21 @@ const SpeakerArrangement k90 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerL const SpeakerArrangement k50_4 = k90; /** L R C Lfe Ls Rs Tfl Tfr Trl Trr */ // 5.1.4 (ITU 4+5+0.1 Sound System D) -const SpeakerArrangement k91 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerTfl| kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +const SpeakerArrangement k91 = k90 | kSpeakerLfe; const SpeakerArrangement k51_4 = k91; /** L R C Ls Rs Tfl Tfr Trl Trr Bfc */ // 5.0.4.1 (ITU 4+5+1.0 Sound System E) -const SpeakerArrangement k50_4_1 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerBfc; +const SpeakerArrangement k50_4_1 = k50_4 | kSpeakerBfc; -/** L R C Lfe Ls Rs Tfl Tfr Trl Trr Bfc */ // 5.1.4.1 (ITU 4+5+1.1 Sound System E) -const SpeakerArrangement k51_4_1 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerBfc; +/** L R C Lfe Ls Rs Tfl Tfr Trl Trr Bfc */ // 5.1.4.1 (ITU 4+5+1.1 Sound System E) +const SpeakerArrangement k51_4_1 = k50_4_1 | kSpeakerLfe; /** L R C Ls Rs Sl Sr Tsl Tsr */ // 7.0.2 const SpeakerArrangement k70_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | kSpeakerTsl | kSpeakerTsr; /** L R C Lfe Ls Rs Sl Sr Tsl Tsr */ // 7.1.2 -const SpeakerArrangement k71_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerSl | kSpeakerSr | kSpeakerTsl | kSpeakerTsr; +const SpeakerArrangement k71_2 = k70_2 | kSpeakerLfe; const SpeakerArrangement k91Atmos = k71_2; // 9.1 Dolby Atmos (3D) /** L R C Ls Rs Sl Sr Tfl Tfr Trc */ // 7.0.3 (ITU 3+7+0.0 Sound System F) @@ -254,16 +272,14 @@ const SpeakerArrangement k70_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeake kSpeakerSl | kSpeakerSr | kSpeakerTfl | kSpeakerTfr | kSpeakerTrc; /** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trc Lfe2 */ // 7.2.3 (ITU 3+7+0.2 Sound System F) -const SpeakerArrangement k72_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerSl | kSpeakerSr | kSpeakerTfl | kSpeakerTfr | kSpeakerTrc | kSpeakerLfe2; +const SpeakerArrangement k72_3 = k70_3 | kSpeakerLfe | kSpeakerLfe2; /** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr */ // 7.0.4 (ITU 4+7+0.0 Sound System J) const SpeakerArrangement k70_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; /** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trl Trr */ // 7.1.4 (ITU 4+7+0.1 Sound System J) -const SpeakerArrangement k71_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +const SpeakerArrangement k71_4 = k70_4 | kSpeakerLfe; const SpeakerArrangement k111MPEG3D = k71_4; /** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr Tsl Tsr */ // 7.0.6 @@ -272,9 +288,7 @@ const SpeakerArrangement k70_6 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerTsl | kSpeakerTsr; /** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trl Trr Tsl Tsr */ // 7.1.6 -const SpeakerArrangement k71_6 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | - kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerTsl | kSpeakerTsr; +const SpeakerArrangement k71_6 = k70_6 | kSpeakerLfe; /** L R C Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr */ // 9.0.4 (ITU 4+9+0.0 Sound System G) const SpeakerArrangement k90_4 = kSpeakerL | kSpeakerR | kSpeakerC | @@ -282,9 +296,7 @@ const SpeakerArrangement k90_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; /** L R C Lfe Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr */ // 9.1.4 (ITU 4+9+0.1 Sound System G) -const SpeakerArrangement k91_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | - kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerSl | kSpeakerSr | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +const SpeakerArrangement k91_4 = k90_4 | kSpeakerLfe; /** L R C Lfe Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr Tsl Tsr */ // 9.0.6 const SpeakerArrangement k90_6 = kSpeakerL | kSpeakerR | kSpeakerC | @@ -292,18 +304,15 @@ const SpeakerArrangement k90_6 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerTsl | kSpeakerTsr; /** L R C Lfe Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr Tsl Tsr */ // 9.1.6 -const SpeakerArrangement k91_6 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | - kSpeakerLs | kSpeakerRs | kSpeakerLc | kSpeakerRc | kSpeakerSl | kSpeakerSr | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerTsl | kSpeakerTsr; +const SpeakerArrangement k91_6 = k90_6 | kSpeakerLfe; -/** L R C Ls Rs Tc Tfl Tfr Trl Trr */ // 5.0.5 +/** L R C Ls Rs Tc Tfl Tfr Trl Trr */ // 5.0.5 (10.0 Auro-3D) const SpeakerArrangement k100 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; const SpeakerArrangement k50_5 = k100; -/** L R C Lfe Ls Rs Tc Tfl Tfr Trl Trr */ // 5.1.5 -const SpeakerArrangement k101 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerTc | kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +/** L R C Lfe Ls Rs Tc Tfl Tfr Trl Trr */ // 5.1.5 (10.1 Auro-3D) +const SpeakerArrangement k101 = k50_5 | kSpeakerLfe; const SpeakerArrangement k101MPEG3D = k101; const SpeakerArrangement k51_5 = k101; @@ -312,14 +321,13 @@ const SpeakerArrangement k102 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeake kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2; const SpeakerArrangement k52_5 = k102; -/** L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr */ // 5.0.6 +/** L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr */ // 5.0.6 (11.0 Auro-3D) const SpeakerArrangement k110 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; const SpeakerArrangement k50_6 = k110; -/** L R C Lfe Ls Rs Tc Tfl Tfc Tfr Trl Trr */ // 5.1.6 -const SpeakerArrangement k111 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | - kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +/** L R C Lfe Ls Rs Tc Tfl Tfc Tfr Trl Trr */ // 5.1.6 (11.1 Auro-3D) +const SpeakerArrangement k111 = k110 | kSpeakerLfe; const SpeakerArrangement k51_6 = k111; /** L R C Lfe Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr Lfe2 */ // 7.2.5 @@ -327,13 +335,12 @@ const SpeakerArrangement k122 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeake kSpeakerTfl| kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerLfe2; const SpeakerArrangement k72_5 = k122; -/** L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */ // 7.0.6 +/** L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */ // 7.0.6 (13.0 Auro-3D) const SpeakerArrangement k130 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; -/** L R C Lfe Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */ // 7.1.6 -const SpeakerArrangement k131 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | - kSpeakerTc | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +/** L R C Lfe Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr */ // 7.1.6 (13.1 Auro-3D) +const SpeakerArrangement k131 = k130 | kSpeakerLfe; /** L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr */ // 6.0.4.4 const SpeakerArrangement k140 = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | @@ -354,13 +361,61 @@ const SpeakerArrangement k222 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeake const SpeakerArrangement k102_9_3 = k222; /** L R C Ls Rs Tfl Tfc Tfr Trl Trr Bfl Bfc Bfr */ // 5.0.5.3 -const SpeakerArrangement k50_5_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | +const SpeakerArrangement k50_5_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | kSpeakerBfl | kSpeakerBfc | kSpeakerBfr; /** L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Bfl Bfc Bfr */ // 5.1.5.3 -const SpeakerArrangement k51_5_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLfe | kSpeakerLs | kSpeakerRs | kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | - kSpeakerBfl | kSpeakerBfc | kSpeakerBfr; - +const SpeakerArrangement k51_5_3 = k50_5_3 | kSpeakerLfe; + +/** L R C Ls Rs Tsl Tsr Bfl Bfr */ // 5.0.2.2 +const SpeakerArrangement k50_2_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTsl | kSpeakerTsr | + kSpeakerBfl | kSpeakerBfr; + +/** L R C Ls Rs Tfl Tfr Trl Trr Bfl Bfr */ // 5.0.4.2 +const SpeakerArrangement k50_4_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr; + +/** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr */ // 7.0.4.2 +const SpeakerArrangement k70_4_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | + kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr; + +/** L R C Ls Rs Tfl Tfc Tfr Trl Trr */ // 5.0.5.0 (Sony 360RA) +const SpeakerArrangement k50_5_Sony = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; + +/** C Sl Sr Cs Tsl Tsr Bsl Bsr */ // 4.0.2.2 (Sony 360RA) +const SpeakerArrangement k40_2_2 = kSpeakerC | kSpeakerSl | kSpeakerSr | kSpeakerCs | + kSpeakerTsl | kSpeakerTsr | + kSpeakerBsl | kSpeakerBsr; + +/** L R Ls Rs Tfl Tfr Trl Trr Bfl Bfr */ // 4.0.4.2 (Sony 360RA) +const SpeakerArrangement k40_4_2 = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr; + +/** L R C Ls Rs Tfl Tfc Tfr Bfl Bfr */ // 5.0.3.2 (Sony 360RA) +const SpeakerArrangement k50_3_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | + kSpeakerBfl | kSpeakerBfr; + +/** L R C Tfl Tfc Tfr Trl Trr Bfl Bfr */ // 3.0.5.2 (Sony 360RA) +const SpeakerArrangement k30_5_2 = kSpeakerL | kSpeakerR | kSpeakerC | + kSpeakerTfl | kSpeakerTfc | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr; + +/** L R Ls Rs Tfl Tfr Trl Trr Bfl Bfr Brl Brr */ // 4.0.4.4 (Sony 360RA) +const SpeakerArrangement k40_4_4 = kSpeakerL | kSpeakerR | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr | kSpeakerBrl | kSpeakerBrr; + +/** L R C Ls Rs Tfl Tfr Trl Trr Bfl Bfr Brl Brr */ // 5.0.4.4 (Sony 360RA) +const SpeakerArrangement k50_4_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | + kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr | + kSpeakerBfl | kSpeakerBfr | kSpeakerBrl | kSpeakerBrr; //------------------------------------------------------------------------ /** Speaker Arrangement String Representation. @@ -403,22 +458,23 @@ const CString kString71Music = "7.1"; const CString kString71MusicOld = "7.1 Music (Dolby)"; const CString kString71CineTopCenter = "7.1 Cine Top Center"; const CString kString71CineCenterHigh = "7.1 Cine Center High"; -const CString kString71CineFrontHigh = "7.1 Cine Front High"; -const CString kString70CineFrontHigh = "7.0 Cine Front High"; -const CString kString71CineSideHigh = "7.1 Cine Side High"; -const CString kString71CineFullRear = "7.1 Cine Full Rear"; -const CString kString71Proximity = "7.1 Proximity"; +const CString kString71CineFullRear = "7.1 Cine Full Rear"; +const CString kString51_2 = "5.1.2"; +const CString kString50_2 = "5.0.2"; +const CString kString50_2TopSide = "5.0.2 Top Side"; +const CString kString51_2TopSide = "5.1.2 Top Side"; +const CString kString71Proximity = "7.1 Proximity"; const CString kString80Cine = "8.0 Cine"; const CString kString80Music = "8.0 Music"; -const CString kString80Cube = "8.0 Cube"; +const CString kString40_4 = "8.0 Cube"; const CString kString81Cine = "8.1 Cine"; const CString kString81Music = "8.1 Music"; const CString kString90Cine = "9.0 Cine"; const CString kString91Cine = "9.1 Cine"; const CString kString100Cine = "10.0 Cine"; const CString kString101Cine = "10.1 Cine"; -const CString kString102 = "10.2 Experimental"; -const CString kString122 = "12.2"; +const CString kString52_5 = "5.2.5"; +const CString kString72_5 = "12.2"; const CString kString50_4 = "5.0.4"; const CString kString51_4 = "5.1.4"; const CString kString50_4_1 = "5.0.4.1"; @@ -435,22 +491,36 @@ const CString kString90_4 = "9.0.4"; const CString kString91_4 = "9.1.4"; const CString kString90_6 = "9.0.6"; const CString kString91_6 = "9.1.6"; -const CString kString100 = "10.0 Auro-3D"; -const CString kString101 = "10.1 Auro-3D"; -const CString kString110 = "11.0 Auro-3D"; -const CString kString111 = "11.1 Auro-3D"; +const CString kString50_5 = "10.0 Auro-3D"; +const CString kString51_5 = "10.1 Auro-3D"; +const CString kString50_6 = "11.0 Auro-3D"; +const CString kString51_6 = "11.1 Auro-3D"; const CString kString130 = "13.0 Auro-3D"; const CString kString131 = "13.1 Auro-3D"; -const CString kString81MPEG = "8.1 MPEG"; -const CString kString140 = "14.0"; +const CString kString41_4_1 = "8.1 MPEG"; +const CString kString60_4_4 = "14.0"; +const CString kString220 = "22.0"; const CString kString222 = "22.2"; -const CString kString220 = "22.0"; const CString kString50_5_3 = "5.0.5.3"; const CString kString51_5_3 = "5.1.5.3"; +const CString kString50_2_2 = "5.0.2.2"; +const CString kString50_4_2 = "5.0.4.2"; +const CString kString70_4_2 = "7.0.4.2"; +const CString kString50_5_Sony = "5.0.5 Sony"; +const CString kString40_2_2 = "4.0.3.2"; +const CString kString40_4_2 = "4.0.4.2"; +const CString kString50_3_2 = "5.0.3.2"; +const CString kString30_5_2 = "3.0.5.2"; +const CString kString40_4_4 = "4.0.4.4"; +const CString kString50_4_4 = "5.0.4.4"; + const CString kStringAmbi1stOrder = "1st Order Ambisonics"; const CString kStringAmbi2cdOrder = "2nd Order Ambisonics"; const CString kStringAmbi3rdOrder = "3rd Order Ambisonics"; - +const CString kStringAmbi4thOrder = "4th Order Ambisonics"; +const CString kStringAmbi5thOrder = "5th Order Ambisonics"; +const CString kStringAmbi6thOrder = "6th Order Ambisonics"; +const CString kStringAmbi7thOrder = "7th Order Ambisonics"; /*@}*/ //------------------------------------------------------------------------ @@ -490,14 +560,15 @@ const CString kString80CineS = "L R C Ls Rs Lc Rc Cs"; const CString kString80MusicS = "L R C Ls Rs Cs Sl Sr"; const CString kString81CineS = "L R C LFE Ls Rs Lc Rc Cs"; const CString kString81MusicS = "L R C LFE Ls Rs Cs Sl Sr"; -const CString kString80CubeS = "L R Ls Rs Tfl Tfr Trl Trr"; +const CString kString40_4S = "L R Ls Rs Tfl Tfr Trl Trr"; const CString kString71CineTopCenterS = "L R C LFE Ls Rs Cs Tc"; const CString kString71CineCenterHighS = "L R C LFE Ls Rs Cs Tfc"; -const CString kString71CineFrontHighS = "L R C LFE Ls Rs Tfl Tfr"; -const CString kString70CineFrontHighS = "L R C Ls Rs Tfl Tfr"; -const CString kString71CineSideHighS = "L R C LFE Ls Rs Tsl Tsr"; -const CString kString71CineFullRearS = "L R C LFE Ls Rs Lcs Rcs"; -const CString kString71ProximityS = "L R C LFE Ls Rs Pl Pr"; +const CString kString71CineFullRearS = "L R C LFE Ls Rs Lcs Rcs"; +const CString kString50_2S = "L R C Ls Rs Tfl Tfr"; +const CString kString51_2S = "L R C LFE Ls Rs Tfl Tfr"; +const CString kString50_2TopSideS = "L R C Ls Rs Tsl Tsr"; +const CString kString51_2TopSideS = "L R C LFE Ls Rs Tsl Tsr"; +const CString kString71ProximityS = "L R C LFE Ls Rs Pl Pr"; const CString kString90CineS = "L R C Ls Rs Lc Rc Sl Sr"; const CString kString91CineS = "L R C LFE Ls Rs Lc Rc Sl Sr"; const CString kString100CineS = "L R C Ls Rs Lc Rc Cs Sl Sr"; @@ -518,24 +589,38 @@ const CString kString90_4S = "L R C Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr"; const CString kString91_4S = "L R C LFE Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr"; const CString kString90_6S = "L R C Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr Tsl Tsr"; const CString kString91_6S = "L R C LFE Ls Rs Lc Rc Sl Sr Tfl Tfr Trl Trr Tsl Tsr"; -const CString kString100S = "L R C Ls Rs Tc Tfl Tfr Trl Trr"; -const CString kString101S = "L R C LFE Ls Rs Tc Tfl Tfr Trl Trr"; -const CString kString110S = "L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr"; -const CString kString111S = "L R C LFE Ls Rs Tc Tfl Tfc Tfr Trl Trr"; +const CString kString50_5S = "L R C Ls Rs Tc Tfl Tfr Trl Trr"; +const CString kString51_5S = "L R C LFE Ls Rs Tc Tfl Tfr Trl Trr"; +const CString kString50_5_SonyS = "L R C Ls Rs Tfl Tfc Tfr Trl Trr"; +const CString kString50_6S = "L R C Ls Rs Tc Tfl Tfc Tfr Trl Trr"; +const CString kString51_6S = "L R C LFE Ls Rs Tc Tfl Tfc Tfr Trl Trr"; const CString kString130S = "L R C Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr"; const CString kString131S = "L R C LFE Ls Rs Sl Sr Tc Tfl Tfc Tfr Trl Trr"; -const CString kString102S = "L R C LFE Ls Rs Tfl Tfc Tfr Trl Trr LFE2"; -const CString kString122S = "L R C LFE Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr LFE2"; -const CString kString81MPEGS = "L R LFE Ls Rs Tfl Tfc Tfr Bfc"; -const CString kString140S = "L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr"; -const CString kString222S = "L R C LFE Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr LFE2 Tsl Tsr Bfl Bfc Bfr"; -const CString kString220S = "L R C Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr Tsl Tsr Bfl Bfc Bfr"; +const CString kString52_5S = "L R C LFE Ls Rs Tfl Tfc Tfr Trl Trr LFE2"; +const CString kString72_5S = "L R C LFE Ls Rs Lc Rc Tfl Tfc Tfr Trl Trr LFE2"; +const CString kString41_4_1S = "L R LFE Ls Rs Tfl Tfc Tfr Bfc"; +const CString kString30_5_2S = "L R C Tfl Tfc Tfr Trl Trr Bfl Bfr"; +const CString kString40_2_2S = "C Sl Sr Cs Tfc Tsl Tsr Trc"; +const CString kString40_4_2S = "L R Ls Rs Tfl Tfr Trl Trr Bfl Bfr"; +const CString kString40_4_4S = "L R Ls Rs Tfl Tfr Trl Trr Bfl Bfr Brl Brr"; +const CString kString50_4_4S = "L R C Ls Rs Tfl Tfr Trl Trr Bfl Bfr Brl Brr"; +const CString kString60_4_4S = "L R Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr Brl Brr"; const CString kString50_5_3S = "L R C Ls Rs Tfl Tfc Tfr Trl Trr Bfl Bfc Bfr"; const CString kString51_5_3S = "L R C LFE Ls Rs Tfl Tfc Tfr Trl Trr Bfl Bfc Bfr"; - -const CString kStringAmbi1stOrderS = "0 1 2 3"; -const CString kStringAmbi2cdOrderS = "0 1 2 3 4 5 6 7 8"; -const CString kStringAmbi3rdOrderS = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"; +const CString kString50_2_2S = "L R C Ls Rs Tsl Tsr Bfl Bfr"; +const CString kString50_3_2S = "L R C Ls Rs Tfl Tfc Tfr Bfl Bfr"; +const CString kString50_4_2S = "L R C Ls Rs Tfl Tfr Trl Trr Bfl Bfr"; +const CString kString70_4_2S = "L R C Ls Rs Sl Sr Tfl Tfr Trl Trr Bfl Bfr"; +const CString kString222S = "L R C LFE Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr LFE2 Tsl Tsr Bfl Bfc Bfr"; +const CString kString220S = "L R C Ls Rs Lc Rc Cs Sl Sr Tc Tfl Tfc Tfr Trl Trc Trr Tsl Tsr Bfl Bfc Bfr"; + +const CString kStringAmbi1stOrderS = "0 1 2 3"; +const CString kStringAmbi2cdOrderS = "0 1 2 3 4 5 6 7 8"; +const CString kStringAmbi3rdOrderS = "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"; +const CString kStringAmbi4thOrderS = "0..24"; +const CString kStringAmbi5thOrderS = "0..35"; +const CString kStringAmbi6thOrderS = "0..48"; +const CString kStringAmbi7thOrderS = "0..63"; /*@}*/ //------------------------------------------------------------------------ @@ -631,8 +716,9 @@ inline bool hasTopSpeakers (const SpeakerArrangement& arr) /** Returns true if arrangement contains bottom (lower layer) speakers */ inline bool hasBottomSpeakers (const SpeakerArrangement& arr) { - if (arr & kSpeakerBfl || arr & kSpeakerBfc || arr & kSpeakerBfl || arr & kSpeakerBfc || - arr & kSpeakerBfr) + if (arr & kSpeakerBfl || arr & kSpeakerBfc || arr & kSpeakerBfr || + arr & kSpeakerBsl || arr & kSpeakerBsr || + arr & kSpeakerBrr || arr & kSpeakerBrl || arr & kSpeakerBrc) return true; return false; } @@ -672,16 +758,39 @@ inline bool is3D (const SpeakerArrangement& arr) } //------------------------------------------------------------------------ -/** Returns true if arrangement is a Auro configuration. */ +/** Returns true if arrangement is a Ambisonic configuration. */ inline bool isAmbisonics (const SpeakerArrangement& arr) { - if (arr == kAmbi1stOrderACN || arr == kAmbi2cdOrderACN || arr == kAmbi3rdOrderACN) + if (arr == kAmbi1stOrderACN || arr == kAmbi2cdOrderACN || arr == kAmbi3rdOrderACN || + arr == kAmbi4thOrderACN || arr == kAmbi5thOrderACN || arr == kAmbi6thOrderACN || + arr == kAmbi7thOrderACN) { return true; } return false; } + +//------------------------------------------------------------------------ +/** Converts a speaker of a Ambisonic order 1 to 4 to a Ambisonic order 7 (5 to 7) (return 0 when out of range).*/ +inline Speaker convertSpeaker_Ambi_1234Order_to_Ambi567Order (Speaker speaker_1234_order) +{ + int32 idx = getSpeakerIndex (speaker_1234_order, kAmbi4thOrderACN); + if (idx < 0) + return 0; + return (Speaker)1 << idx; +} + +//------------------------------------------------------------------------ +/** Converts a speaker of a Ambisonic order 5 to 7 to a Ambisonic order 4 (1 to 4) (return 0 when out of range).*/ +inline Speaker convertSpeaker_Ambi_567Order_to_Ambi1234Order (Speaker speaker_567_order) +{ + int32 idx = getSpeakerIndex (speaker_567_order, kAmbi7thOrderACN); + if (idx < 0) + return 0; + return getSpeaker (kAmbi4thOrderACN, idx); +} + //------------------------------------------------------------------------ /** Returns the speaker arrangement associated to a string representation. Returns kEmpty if no associated arrangement is known. */ @@ -755,22 +864,24 @@ inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr) return k81Cine; if (!strcmp8 (arrStr, kString81Music)) return k81Music; - if (!strcmp8 (arrStr, kString102)) - return k102; - if (!strcmp8 (arrStr, kString122)) - return k122; - if (!strcmp8 (arrStr, kString80Cube)) - return k80Cube; + if (!strcmp8 (arrStr, kString52_5)) + return k52_5; + if (!strcmp8 (arrStr, kString72_5)) + return k72_5; + if (!strcmp8 (arrStr, kString40_4)) + return k40_4; if (!strcmp8 (arrStr, kString71CineTopCenter)) return k71CineTopCenter; if (!strcmp8 (arrStr, kString71CineCenterHigh)) return k71CineCenterHigh; - if (!strcmp8 (arrStr, kString71CineFrontHigh)) - return k71CineFrontHigh; - if (!strcmp8 (arrStr, kString70CineFrontHigh)) - return k70CineFrontHigh; - if (!strcmp8 (arrStr, kString71CineSideHigh)) - return k71CineSideHigh; + if (!strcmp8 (arrStr, kString50_2)) + return k50_2; + if (!strcmp8 (arrStr, kString51_2)) + return k51_2; + if (!strcmp8 (arrStr, kString50_2TopSide)) + return k50_2_TS; + if (!strcmp8 (arrStr, kString51_2TopSide)) + return k51_2_TS; if (!strcmp8 (arrStr, kString71CineFullRear)) return k71CineFullRear; if (!strcmp8 (arrStr, kString90Cine)) @@ -789,8 +900,8 @@ inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr) return k50_4_1; if (!strcmp8 (arrStr, kString51_4_1)) return k51_4_1; - if (!strcmp8 (arrStr, kString81MPEG)) - return k81MPEG3D; + if (!strcmp8 (arrStr, kString41_4_1)) + return k41_4_1; if (!strcmp8 (arrStr, kString70_2)) return k70_2; if (!strcmp8 (arrStr, kString71_2)) @@ -815,20 +926,20 @@ inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr) return k90_6; if (!strcmp8 (arrStr, kString91_6)) return k91_6; - if (!strcmp8 (arrStr, kString100)) - return k100; - if (!strcmp8 (arrStr, kString101)) - return k101; - if (!strcmp8 (arrStr, kString110)) - return k110; - if (!strcmp8 (arrStr, kString111)) - return k111; + if (!strcmp8 (arrStr, kString50_5)) + return k50_5; + if (!strcmp8 (arrStr, kString51_5)) + return k51_5; + if (!strcmp8 (arrStr, kString50_6)) + return k50_6; + if (!strcmp8 (arrStr, kString51_6)) + return k51_6; if (!strcmp8 (arrStr, kString130)) return k130; if (!strcmp8 (arrStr, kString131)) return k131; - if (!strcmp8 (arrStr, kString140)) - return k140; + if (!strcmp8 (arrStr, kString60_4_4)) + return k60_4_4; if (!strcmp8 (arrStr, kString222)) return k222; if (!strcmp8 (arrStr, kString220)) @@ -837,12 +948,42 @@ inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr) return k50_5_3; if (!strcmp8 (arrStr, kString51_5_3)) return k51_5_3; + if (!strcmp8 (arrStr, kString50_2_2)) + return k50_2_2; + if (!strcmp8 (arrStr, kString50_4_2)) + return k50_4_2; + if (!strcmp8 (arrStr, kString70_4_2)) + return k70_4_2; + + if (!strcmp8 (arrStr, kString50_5_Sony)) + return k50_5_Sony; + if (!strcmp8 (arrStr, kString40_2_2)) + return k40_2_2; + if (!strcmp8 (arrStr, kString40_4_2)) + return k40_4_2; + if (!strcmp8 (arrStr, kString50_3_2)) + return k50_3_2; + if (!strcmp8 (arrStr, kString30_5_2)) + return k30_5_2; + if (!strcmp8 (arrStr, kString40_4_4)) + return k40_4_4; + if (!strcmp8 (arrStr, kString50_4_4)) + return k50_4_4; + if (!strcmp8 (arrStr, kStringAmbi1stOrder)) return kAmbi1stOrderACN; if (!strcmp8 (arrStr, kStringAmbi2cdOrder)) return kAmbi2cdOrderACN; if (!strcmp8 (arrStr, kStringAmbi3rdOrder)) return kAmbi3rdOrderACN; + if (!strcmp8 (arrStr, kStringAmbi4thOrder)) + return kAmbi4thOrderACN; + if (!strcmp8 (arrStr, kStringAmbi5thOrder)) + return kAmbi5thOrderACN; + if (!strcmp8 (arrStr, kStringAmbi6thOrder)) + return kAmbi6thOrderACN; + if (!strcmp8 (arrStr, kStringAmbi7thOrder)) + return kAmbi7thOrderACN; return kEmpty; } @@ -854,6 +995,7 @@ inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpe switch (arr) { case kMono: return withSpeakersName ? kStringMonoS : kStringMono; + //--- Stereo pairs--- case kStereo: return withSpeakersName ? kStringStereoS : kStringStereo; case kStereoSurround: return withSpeakersName ? kStringStereoRS : kStringStereoR; case kStereoCenter: return withSpeakersName ? kStringStereoCS : kStringStereoC; @@ -863,59 +1005,61 @@ inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpe case kStereoTS: return withSpeakersName ? kStringStereoTSS : kStringStereoTS; case kStereoTR: return withSpeakersName ? kStringStereoTRS : kStringStereoTR; case kStereoBF: return withSpeakersName ? kStringStereoBFS : kStringStereoBF; + + //--- --- case kCineFront: return withSpeakersName ? kStringCineFrontS : kStringCineFront; case k30Cine: return withSpeakersName ? kString30CineS : kString30Cine; - case k30Music: return withSpeakersName ? kString30MusicS : kString30Music; case k31Cine: return withSpeakersName ? kString31CineS : kString31Cine; + case k30Music: return withSpeakersName ? kString30MusicS : kString30Music; case k31Music: return withSpeakersName ? kString31MusicS : kString31Music; case k40Cine: return withSpeakersName ? kString40CineS : kString40Cine; - case k40Music: return withSpeakersName ? kString40MusicS : kString40Music; case k41Cine: return withSpeakersName ? kString41CineS : kString41Cine; + case k40Music: return withSpeakersName ? kString40MusicS : kString40Music; case k41Music: return withSpeakersName ? kString41MusicS : kString41Music; case k50: return withSpeakersName ? kString50S : kString50; case k51: return withSpeakersName ? kString51S : kString51; case k60Cine: return withSpeakersName ? kString60CineS : kString60Cine; - case k60Music: return withSpeakersName ? kString60MusicS : kString60Music; case k61Cine: return withSpeakersName ? kString61CineS : kString61Cine; + case k60Music: return withSpeakersName ? kString60MusicS : kString60Music; case k61Music: return withSpeakersName ? kString61MusicS : kString61Music; case k70Cine: return withSpeakersName ? kString70CineS : kString70Cine; - case k70Music: return withSpeakersName ? kString70MusicS : kString70Music; case k71Cine: return withSpeakersName ? kString71CineS : kString71Cine; + case k70Music: return withSpeakersName ? kString70MusicS : kString70Music; case k71Music: return withSpeakersName ? kString71MusicS : kString71Music; case k71Proximity: return withSpeakersName ? kString71ProximityS : kString71Proximity; case k80Cine: return withSpeakersName ? kString80CineS : kString80Cine; - case k80Music: return withSpeakersName ? kString80MusicS : kString80Music; case k81Cine: return withSpeakersName ? kString81CineS : kString81Cine; + case k80Music: return withSpeakersName ? kString80MusicS : kString80Music; case k81Music: return withSpeakersName ? kString81MusicS : kString81Music; - case k81MPEG3D: return withSpeakersName ? kString81MPEGS : kString81MPEG; - case k102: return withSpeakersName ? kString102S : kString102; - case k122: return withSpeakersName ? kString122S : kString122; - case k80Cube: return withSpeakersName ? kString80CubeS : kString80Cube; - case k71CineTopCenter: return withSpeakersName ? kString71CineTopCenterS : kString71CineTopCenter; - case k71CineCenterHigh: return withSpeakersName ? kString71CineCenterHighS : kString71CineCenterHigh; - case k71CineFrontHigh: return withSpeakersName ? kString71CineFrontHighS : kString71CineFrontHigh; - case k70CineFrontHigh: return withSpeakersName ? kString70CineFrontHighS : kString70CineFrontHigh; - case k71CineSideHigh: return withSpeakersName ? kString71CineSideHighS : kString71CineSideHigh; - case k71CineFullRear: return withSpeakersName ? kString71CineFullRearS : kString71CineFullRear; - case k90Cine: return withSpeakersName ? kString90CineS : kString90Cine; + case k71CineFullRear: return withSpeakersName ? kString71CineFullRearS : kString71CineFullRear; + case k90Cine: return withSpeakersName ? kString90CineS : kString90Cine; case k91Cine: return withSpeakersName ? kString91CineS : kString91Cine; case k100Cine: return withSpeakersName ? kString100CineS : kString100Cine; case k101Cine: return withSpeakersName ? kString101CineS : kString101Cine; - case k100: return withSpeakersName ? kString100S : kString100; - case k101: return withSpeakersName ? kString101S : kString101; - case k110: return withSpeakersName ? kString110S : kString110; - case k111: return withSpeakersName ? kString111S : kString111; + //---With Tops --- + case k71CineTopCenter: return withSpeakersName ? kString71CineTopCenterS : kString71CineTopCenter; + case k71CineCenterHigh: return withSpeakersName ? kString71CineCenterHighS : kString71CineCenterHigh; + case k50_2_TS: return withSpeakersName ? kString50_2TopSideS : kString50_2TopSide; + case k51_2_TS: return withSpeakersName ? kString51_2TopSideS : kString51_2TopSide; + + case k40_4: return withSpeakersName ? kString40_4S : kString40_4; + case k50_2: return withSpeakersName ? kString50_2S : kString50_2; + case k51_2: return withSpeakersName ? kString51_2S : kString51_2; case k50_4: return withSpeakersName ? kString50_4S : kString50_4; case k51_4: return withSpeakersName ? kString51_4S : kString51_4; - case k50_4_1: return withSpeakersName ? kString50_4_1S : kString50_4_1; - case k51_4_1: return withSpeakersName ? kString51_4_1S : kString51_4_1; + case k50_5: return withSpeakersName ? kString50_5S : kString50_5; + case k51_5: return withSpeakersName ? kString51_5S : kString51_5; + case k52_5: return withSpeakersName ? kString52_5S : kString52_5; + case k50_6: return withSpeakersName ? kString50_6S : kString50_6; + case k51_6: return withSpeakersName ? kString51_6S : kString51_6; case k70_2: return withSpeakersName ? kString70_2S : kString70_2; case k71_2: return withSpeakersName ? kString71_2S : kString71_2; case k70_3: return withSpeakersName ? kString70_3S : kString70_3; case k72_3: return withSpeakersName ? kString72_3S : kString72_3; case k70_4: return withSpeakersName ? kString70_4S : kString70_4; case k71_4: return withSpeakersName ? kString71_4S : kString71_4; + case k72_5: return withSpeakersName ? kString72_5S : kString72_5; case k70_6: return withSpeakersName ? kString70_6S : kString70_6; case k71_6: return withSpeakersName ? kString71_6S : kString71_6; case k90_4: return withSpeakersName ? kString90_4S : kString90_4; @@ -924,21 +1068,44 @@ inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpe case k91_6: return withSpeakersName ? kString91_6S : kString91_6; case k130: return withSpeakersName ? kString130S : kString130; case k131: return withSpeakersName ? kString131S : kString131; - case k140: return withSpeakersName ? kString140S : kString140; - case k222: return withSpeakersName ? kString222S : kString222; - case k220: return withSpeakersName ? kString220S : kString220; + + //--- With Tops and Bottoms --- + case k41_4_1: return withSpeakersName ? kString41_4_1S : kString41_4_1; + case k50_4_1: return withSpeakersName ? kString50_4_1S : kString50_4_1; + case k51_4_1: return withSpeakersName ? kString51_4_1S : kString51_4_1; case k50_5_3: return withSpeakersName ? kString50_5_3S : kString50_5_3; case k51_5_3: return withSpeakersName ? kString51_5_3S : kString51_5_3; - break; - } + case k50_2_2: return withSpeakersName ? kString50_2_2S : kString50_2_2; + case k50_4_2: return withSpeakersName ? kString50_4_2S : kString50_4_2; + case k60_4_4: return withSpeakersName ? kString60_4_4S : kString60_4_4; + case k70_4_2: return withSpeakersName ? kString70_4_2S : kString70_4_2; + + case k50_5_Sony: return withSpeakersName ? kString50_5_SonyS : kString50_5_Sony; + case k40_2_2: return withSpeakersName ? kString40_2_2S : kString40_2_2; + case k40_4_2: return withSpeakersName ? kString40_4_2S : kString40_4_2; + case k50_3_2: return withSpeakersName ? kString50_3_2S : kString50_3_2; + case k30_5_2: return withSpeakersName ? kString30_5_2S : kString30_5_2; + case k40_4_4: return withSpeakersName ? kString40_4_4S : kString40_4_4; + case k50_4_4: return withSpeakersName ? kString50_4_4S : kString50_4_4; + case k220: return withSpeakersName ? kString220S : kString220; + case k222: return withSpeakersName ? kString222S : kString222; + } + //--- Ambisonics --- if (arr == kAmbi1stOrderACN) return withSpeakersName ? kStringAmbi1stOrderS : kStringAmbi1stOrder; if (arr == kAmbi2cdOrderACN) return withSpeakersName ? kStringAmbi2cdOrderS : kStringAmbi2cdOrder; if (arr == kAmbi3rdOrderACN) return withSpeakersName ? kStringAmbi3rdOrderS : kStringAmbi3rdOrder; - + if (arr == kAmbi4thOrderACN) + return withSpeakersName ? kStringAmbi4thOrderS : kStringAmbi4thOrder; + if (arr == kAmbi5thOrderACN) + return withSpeakersName ? kStringAmbi5thOrderS : kStringAmbi5thOrder; + if (arr == kAmbi6thOrderACN) + return withSpeakersName ? kStringAmbi6thOrderS : kStringAmbi6thOrder; + if (arr == kAmbi7thOrderACN) + return withSpeakersName ? kStringAmbi7thOrderS : kStringAmbi7thOrder; return kStringEmpty; } @@ -1041,6 +1208,24 @@ inline CString getSpeakerShortName (const SpeakerArrangement& arr, int32 index) return "14"; if (speaker == kSpeakerACN15) return "15"; + if (speaker == kSpeakerACN16) + return "16"; + if (speaker == kSpeakerACN17) + return "17"; + if (speaker == kSpeakerACN18) + return "18"; + if (speaker == kSpeakerACN19) + return "19"; + if (speaker == kSpeakerACN20) + return "20"; + if (speaker == kSpeakerACN21) + return "21"; + if (speaker == kSpeakerACN22) + return "22"; + if (speaker == kSpeakerACN23) + return "23"; + if (speaker == kSpeakerACN24) + return "24"; if (speaker == kSpeakerTsl) return "Tsl"; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h index b0752097f4..081177fa68 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h @@ -24,17 +24,18 @@ namespace Vst { //------------------------------------------------------------------------ /** VST 3 SDK Version */ #ifndef kVstVersionString -#define kVstVersionString "VST 3.7.7" ///< SDK version for PClassInfo2 +#define kVstVersionString "VST 3.7.8" ///< SDK version for PClassInfo2 #endif #define kVstVersionMajor 3 #define kVstVersionMinor 7 -#define kVstVersionSub 7 +#define kVstVersionSub 8 #define VST_VERSION ((kVstVersionMajor << 16) | (kVstVersionMinor << 8) | kVstVersionSub) // Versions History which allows to write such code: // #if VST_VERSION >= VST_3_6_5_VERSION +#define VST_3_7_8_VERSION 0x030708 #define VST_3_7_7_VERSION 0x030707 #define VST_3_7_6_VERSION 0x030706 #define VST_3_7_5_VERSION 0x030705 diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt index 992e70b27c..f9c531e745 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/LICENSE.txt @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp index 10b6a7269f..588627e010 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -35,13 +35,14 @@ // OF THE POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- -#include "public.sdk/source/common/memorystream.h" #include "public.sdk/source/vst/hosting/module.h" #include "public.sdk/source/vst/moduleinfo/moduleinfocreator.h" #include "public.sdk/source/vst/moduleinfo/moduleinfoparser.h" +#include "public.sdk/source/vst/utility/stringconvert.h" +#include "public.sdk/source/common/readfile.h" #include "base/source/fcommandline.h" #include "pluginterfaces/vst/vsttypes.h" -#include "pluginterfaces/base/iplugincompatibility.h" +#include "pluginterfaces/base/fplatform.h" #include #include #include @@ -73,26 +74,10 @@ void printUsage (std::ostream& s) s << " moduleinfotool -validate -path MODULE_PATH [-infopath PATH]\n"; } -//------------------------------------------------------------------------ -std::string loadFile (const std::string& path) -{ - std::ifstream file (path, std::ios_base::in | std::ios_base::binary); - if (!file.is_open ()) - return {}; - auto size = file.seekg (0, std::ios_base::end).tellg (); - file.seekg (0, std::ios_base::beg); - std::string data; - data.resize (size); - file.read (data.data (), data.size ()); - if (file.bad ()) - return {}; - return data; -} - //------------------------------------------------------------------------ std::optional openAndParseCompatJSON (const std::string& path) { - auto data = loadFile (path); + auto data = readFile (path); if (data.empty ()) { std::cout << "Can not read '" << path << "'\n"; @@ -111,35 +96,6 @@ std::optional openAndParseCompatJSON (const std:: return result; } -//------------------------------------------------------------------------ -std::optional loadCompatibilityFromModule (const VST3::Hosting::Module& module) -{ - const auto& factory = module.getFactory(); - const auto& infos = factory.classInfos(); - - const auto iter = std::find_if (infos.begin(), infos.end(), [&] (const auto& info) - { - return info.category() == kPluginCompatibilityClass; - }); - - if (iter == infos.end()) - return {}; - - const auto compatibility = factory.createInstance (iter->ID()); - - if (compatibility == nullptr) - return {}; - - Steinberg::MemoryStream stream; - - if (compatibility->getCompatibilityJSON (&stream) != kResultOk) - return {}; - - const std::string_view streamView (stream.getData(), stream.getSize()); - - return ModuleInfoLib::parseCompatibilityJson (streamView, nullptr); -} - //------------------------------------------------------------------------ int createJSON (const std::optional& compat, const std::string& modulePath, const std::string& moduleVersion, @@ -155,9 +111,6 @@ int createJSON (const std::optional& compat, auto moduleInfo = ModuleInfoLib::createModuleInfo (*module, false); if (compat) moduleInfo.compatibility = *compat; - else if (auto loaded = loadCompatibilityFromModule (*module)) - moduleInfo.compatibility = *loaded; - moduleInfo.version = moduleVersion; std::stringstream output; @@ -275,7 +228,7 @@ int validate (const std::string& modulePath, std::string infoJsonPath) infoJsonPath = *path; } - auto data = loadFile (infoJsonPath); + auto data = readFile (infoJsonPath); if (data.empty ()) { std::cerr << "Empty or non existing file: '" << infoJsonPath << "'" << '\n'; @@ -364,13 +317,19 @@ int run (int argc, char* argv[]) if (valueMap.count (optOutputPath) != 0) { writeToFile = true; +#if SMTG_OS_WINDOWS + auto tmp = VST3::StringConvert::convert (valueMap[optOutputPath]); + auto outputFile = reinterpret_cast (tmp.data ()); +#else auto outputFile = valueMap[optOutputPath]; +#endif auto ostream = new std::ofstream (outputFile); + if (ostream->is_open ()) outputStream = ostream; else { - std::cout << "Cannot create output file: " << outputFile << '\n'; + std::cout << "Cannot create output file: " << valueMap[optOutputPath] << '\n'; return result; } } @@ -394,7 +353,53 @@ int run (int argc, char* argv[]) } // Steinberg //------------------------------------------------------------------------ +#if SMTG_OS_WINDOWS +//------------------------------------------------------------------------ +#include +#include + +//------------------------------------------------------------------------ +using Utf8String = std::string; + +//------------------------------------------------------------------------ +using Utf8Args = std::vector; +Utf8Args toUtf8Args (int argc, wchar_t* wargv[]) +{ + Utf8Args utf8Args; + for (int i = 0; i < argc; i++) + { + auto str = reinterpret_cast(wargv[i]); + utf8Args.push_back (VST3::StringConvert::convert (str)); + } + + return utf8Args; +} + +//------------------------------------------------------------------------ +using Utf8ArgPtrs = std::vector; +Utf8ArgPtrs toUtf8ArgPtrs (Utf8Args& utf8Args) +{ + Utf8ArgPtrs utf8ArgPtrs; + for (auto& el : utf8Args) + { + utf8ArgPtrs.push_back (el.data ()); + } + + return utf8ArgPtrs; +} + +//------------------------------------------------------------------------ +int wmain (int argc, wchar_t* wargv[]) +{ + Utf8Args utf8Args = toUtf8Args (argc, wargv); + Utf8ArgPtrs utf8ArgPtrs = toUtf8ArgPtrs (utf8Args); + + char** argv = &(utf8ArgPtrs.at (0)); + return Steinberg::ModuleInfoTool::run (argc, argv); +} +#else int main (int argc, char* argv[]) { return Steinberg::ModuleInfoTool::run (argc, argv); } +#endif diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp index e048533688..5b6c245e00 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -36,7 +36,7 @@ #include "memorystream.h" #include "pluginterfaces/base/futils.h" -#include +#include namespace Steinberg { diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h index 115a3a563b..489ace5fff 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp index b828e9e829..02dd9fd21b 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h index c88f9b6806..ce131b94cb 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -51,7 +51,7 @@ class CPluginView : public FObject, public IPlugView public: //------------------------------------------------------------------------ CPluginView (const ViewRect* rect = nullptr); - virtual ~CPluginView (); + ~CPluginView () SMTG_OVERRIDE; /** Returns its current frame rectangle. */ const ViewRect& getRect () const { return rect; } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp new file mode 100644 index 0000000000..5f6045770a --- /dev/null +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// Project : VST SDK +// Flags : clang-format SMTGSequencer +// +// Category : readfile +// Filename : public.sdk/source/common/readfile.cpp +// Created by : Steinberg, 3/2023 +// Description : read file routine +// +//----------------------------------------------------------------------------- +// LICENSE +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved +//----------------------------------------------------------------------------- +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Steinberg Media Technologies nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. +//----------------------------------------------------------------------------- + +#include "readfile.h" +#include "public.sdk/source/vst/utility/stringconvert.h" +#include "pluginterfaces/base/fplatform.h" +#include +#include + +namespace Steinberg { + +//------------------------------------------------------------------------ +std::string readFile (const std::string& path) +{ +#if SMTG_OS_WINDOWS + auto u16Path = VST3::StringConvert::convert (path); + std::ifstream file (reinterpret_cast (u16Path.data ()), + std::ios_base::in | std::ios_base::binary); +#else + std::ifstream file (path, std::ios_base::in | std::ios_base::binary); +#endif + if (!file.is_open ()) + return {}; + +#if SMTG_CPP17 + auto size = file.seekg (0, std::ios_base::end).tellg (); + file.seekg (0, std::ios_base::beg); + std::string data; + data.resize (size); + file.read (data.data (), data.size ()); + if (file.bad ()) + return {}; + return data; +#else + std::stringstream buffer; + buffer << file.rdbuf (); + return buffer.str (); +#endif +} + +//------------------------------------------------------------------------ +} // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h new file mode 100644 index 0000000000..fdc7105eac --- /dev/null +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h @@ -0,0 +1,55 @@ +//----------------------------------------------------------------------------- +// Flags : clang-format SMTGSequencer +// Project : VST SDK +// +// Category : readfile +// Filename : public.sdk/source/common/readfile.h +// Created by : Steinberg, 3/2023 +// Description : read file routine +// +//----------------------------------------------------------------------------- +// LICENSE +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved +//----------------------------------------------------------------------------- +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Steinberg Media Technologies nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. +//----------------------------------------------------------------------------- + +#pragma once + +#include + +namespace Steinberg { + +//------------------------------------------------------------------------ +/** Reads entire file content +\ingroup sdkBase + +Returns entire file content at the given path +\endcode +*/ +std::string readFile (const std::string& path); + +//------------------------------------------------------------------------ + +} // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp index a06fd5d8da..e04987e16e 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h index e5589e1950..4a254cac16 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp index efb65dd461..9ce5b57522 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.h index 70d0d3746b..36b3afad2e 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -186,6 +186,7 @@ public: const std::string& getName () const noexcept { return name; } const std::string& getPath () const noexcept { return path; } const PluginFactory& getFactory () const noexcept { return factory; } + bool isBundle () const noexcept { return hasBundleStructure; } //------------------------------------------------------------------------ protected: virtual ~Module () noexcept = default; @@ -194,6 +195,7 @@ protected: PluginFactory factory {nullptr}; std::string name; std::string path; + bool hasBundleStructure {true}; }; //------------------------------------------------------------------------ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp index d999cd718c..404054c828 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -43,23 +43,31 @@ #include #include -#if (__cplusplus >= 201703L) +#if SMTG_CPP17 + #if __has_include() #define USE_EXPERIMENTAL_FS 0 #elif __has_include() #define USE_EXPERIMENTAL_FS 1 #endif -#else + +#else // !SMTG_CPP17 + #define USE_EXPERIMENTAL_FS 1 -#endif + +#endif // SMTG_CPP17 #if USE_EXPERIMENTAL_FS == 1 + #include namespace filesystem = std::experimental::filesystem; -#else + +#else // USE_FILESYSTEM == 0 + #include namespace filesystem = std::filesystem; -#endif + +#endif // USE_FILESYSTEM //------------------------------------------------------------------------ extern "C" { @@ -347,9 +355,9 @@ Module::SnapshotList Module::getSnapshots (const std::string& modulePath) //------------------------------------------------------------------------ Optional Module::getModuleInfoPath (const std::string& modulePath) { - SnapshotList result; filesystem::path path (modulePath); path /= "Contents"; + path /= "Resources"; path /= "moduleinfo.json"; if (filesystem::exists (path)) return {path.generic_string ()}; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm index 1fbc4b70e7..49a7155543 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -373,10 +373,10 @@ Optional Module::getModuleInfoPath (const std::string& modulePath) auto bundleUrl = [NSURL fileURLWithPath:nsString]; if (!bundleUrl) return {}; - auto contentsUrl = [bundleUrl URLByAppendingPathComponent:@"Contents"]; - if (!contentsUrl) - return {}; - auto moduleInfoUrl = [contentsUrl URLByAppendingPathComponent:@"moduleinfo.json"]; + auto moduleInfoUrl = [NSBundle URLForResource:@"moduleinfo" + withExtension:@"json" + subdirectory:nullptr + inBundleWithURL:bundleUrl]; if (!moduleInfoUrl) return {}; NSError* error = nil; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp index 2ba93191fa..77990fdcca 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -93,6 +93,13 @@ namespace { #define USE_OLE !USE_FILESYSTEM +// for testing only +#if 0 // DEVELOPMENT +#define LOG_ENABLE 1 +#else +#define LOG_ENABLE 0 +#endif + #if SMTG_PLATFORM_64 #if SMTG_OS_WINDOWS_ARM @@ -201,13 +208,23 @@ public: "LoadLibrary failed with error number : " + std::to_string (lastError); } } + else + { + hasBundleStructure = false; + } return instance; } //--- ----------------------------------------------------------------------- bool load (const std::string& inPath, std::string& errorDescription) override { - if (filesystem::is_directory (inPath)) + // filesystem::u8path is deprecated in C++20 +#if SMTG_CPP20 + const filesystem::path tmp (inPath); +#else + const filesystem::path tmp = filesystem::u8path (inPath); +#endif + if (filesystem::is_directory (tmp)) { // try as package (bundle) mModule = loadAsPackage (inPath); @@ -357,6 +374,16 @@ VST3::Optional resolveShellLink (const filesystem::path& p) #endif } +//------------------------------------------------------------------------ +void addToPathList (Module::PathList& pathList, const std::string& toAdd) +{ +#if LOG_ENABLE + std::cout << "=> add: " << toAdd << "\n"; +#endif + + pathList.push_back (toAdd); +} + //------------------------------------------------------------------------ void findFilesWithExt (const filesystem::path& path, const std::string& ext, Module::PathList& pathList, bool recursive = true) @@ -382,7 +409,7 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext, filesystem::path result; if (checkVST3Package (finalPath, &result)) { - pathList.push_back (result.generic_string ()); + addToPathList (pathList, result.generic_string ()); continue; } } @@ -393,7 +420,7 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext, findFilesWithExt (finalPath, ext, pathList, recursive); } else if (cpExt == ext) - pathList.push_back (finalPath.generic_string ()); + addToPathList (pathList, finalPath.generic_string ()); #else const auto& cp = p.path (); const auto& cpExt = cp.extension (); @@ -405,13 +432,13 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext, filesystem::path result; if (checkVST3Package (p, &result)) { - pathList.push_back (result.generic_u8string ()); + addToPathList (pathList, result.generic_u8string ()); continue; } findFilesWithExt (cp, ext, pathList, recursive); } else - pathList.push_back (cp.generic_u8string ()); + addToPathList (pathList, cp.generic_u8string ()); } else if (recursive) { @@ -431,13 +458,13 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext, filesystem::path result; if (checkVST3Package (*resolvedLink, &result)) { - pathList.push_back (result.generic_u8string ()); + addToPathList (pathList, result.generic_u8string ()); continue; } findFilesWithExt (*resolvedLink, ext, pathList, recursive); } else - pathList.push_back (resolvedLink->generic_u8string ()); + addToPathList (pathList, resolvedLink->generic_u8string ()); } else if (filesystem::is_directory (*resolvedLink)) { @@ -502,18 +529,24 @@ Module::PathList Module::getModulePaths () PathList list; if (auto knownFolder = getKnownFolder (FOLDERID_UserProgramFilesCommon)) { - filesystem::path p (*knownFolder); - p.append ("VST3"); - findModules (p, list); + filesystem::path path (*knownFolder); + path.append ("VST3"); +#if LOG_ENABLE + std::cout << "Check folder: " << path << "\n"; +#endif + findModules (path, list); } if (auto knownFolder = getKnownFolder (FOLDERID_ProgramFilesCommon)) { - filesystem::path p (*knownFolder); - p.append ("VST3"); - findModules (p, list); + filesystem::path path (*knownFolder); + path.append ("VST3"); +#if LOG_ENABLE + std::cout << "Check folder: " << path << "\n"; +#endif + findModules (path, list); } - + // find plug-ins located in VST3 (application folder) WCHAR modulePath[kIPPathNameMax]; GetModuleFileNameW (nullptr, modulePath, kIPPathNameMax); @@ -521,6 +554,9 @@ Module::PathList Module::getModulePaths () filesystem::path path (appPath); path = path.parent_path (); path = path.append ("VST3"); +#if LOG_ENABLE + std::cout << "Check folder: " << path << "\n"; +#endif findModules (path, list); return list; @@ -540,6 +576,7 @@ Optional Module::getModuleInfoPath (const std::string& modulePath) path = Optional {p}; } + *path /= "Resources"; *path /= "moduleinfo.json"; if (filesystem::exists (*path)) diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp index 25a949a706..adabdb9028 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h index bf1773e831..a88cbf6815 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/pluginterfacesupport.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/jsoncxx.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/jsoncxx.h index da9f3ca1b5..979c2f8527 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/jsoncxx.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/jsoncxx.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -81,8 +81,8 @@ struct Iterator bool operator== (const Iterator& other) const { return other.el == el; } bool operator!= (const Iterator& other) const { return other.el != el; } - JsonElement operator* () const { return el; } - JsonElement operator-> () const { return el; } + const JsonElement& operator* () const { return el; } + const JsonElement& operator-> () const { return el; } Iterator& operator++ () { diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfo.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfo.h index 3180fccd07..81b93f74be 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfo.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfo.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp index d266a0147f..8f12829c7d 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -306,4 +306,4 @@ void outputJson (const ModuleInfo& info, std::ostream& output) } //------------------------------------------------------------------------ -} // Steinberg::ModuelInfoLib +} // Steinberg::ModuleInfoLib diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.h index 6be510a983..f28716ae2a 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfocreator.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp index a68d5db547..0d09d2bb0c 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -38,8 +38,8 @@ #include "moduleinfoparser.h" #include "jsoncxx.h" #include "pluginterfaces/base/ipluginbase.h" -#include #include +#include //------------------------------------------------------------------------ namespace Steinberg::ModuleInfoLib { @@ -141,7 +141,7 @@ struct ModuleInfoJsonParser uint32_t parsed {0}; if (auto obj = value.asObject ()) { - for (const auto el : *obj) + for (const auto& el : *obj) { auto elementName = el.name ().text (); if (elementName == "Vendor") @@ -172,7 +172,7 @@ struct ModuleInfoJsonParser auto flags = el.value ().asObject (); if (!flags) throw parse_error ("Expect 'Flags' to be a JSON Object", el.name ()); - for (const auto flag : *flags) + for (const auto& flag : *flags) { auto flagName = flag.name ().text (); auto flagValue = flag.value ().asBoolean (); @@ -229,7 +229,7 @@ struct ModuleInfoJsonParser auto array = value.asArray (); if (!array) throw parse_error ("Expect Classes Array", value); - for (const auto classInfoEl : *array) + for (const auto& classInfoEl : *array) { auto classInfo = classInfoEl.value ().asObject (); if (!classInfo) @@ -239,7 +239,7 @@ struct ModuleInfoJsonParser uint32_t parsed {0}; - for (const auto el : *classInfo) + for (const auto& el : *classInfo) { auto elementName = el.name ().text (); if (elementName == "CID") @@ -291,7 +291,7 @@ struct ModuleInfoJsonParser auto subCatArr = el.value ().asArray (); if (!subCatArr) throw parse_error ("Expect Array here", el.value ()); - for (const auto catEl : *subCatArr) + for (const auto& catEl : *subCatArr) { auto cat = getText (catEl.value ()); ci.subCategories.emplace_back (cat); @@ -319,13 +319,13 @@ struct ModuleInfoJsonParser auto snapArr = el.value ().asArray (); if (!snapArr) throw parse_error ("Expect Array here", el.value ()); - for (const auto snapEl : *snapArr) + for (const auto& snapEl : *snapArr) { auto snap = snapEl.value ().asObject (); if (!snap) throw parse_error ("Expect Object here", snapEl.value ()); ModuleInfo::Snapshot snapshot; - for (const auto spEl : *snap) + for (const auto& spEl : *snap) { auto spElName = spEl.name ().text (); if (spElName == "Path") @@ -369,14 +369,14 @@ struct ModuleInfoJsonParser auto arr = value.asArray (); if (!arr) throw parse_error ("Expect Array here", value); - for (const auto el : *arr) + for (const auto& el : *arr) { auto obj = el.value ().asObject (); if (!obj) throw parse_error ("Expect Object here", el.value ()); ModuleInfo::Compatibility compat; - for (const auto objEl : *obj) + for (const auto& objEl : *obj) { auto elementName = objEl.name ().text (); if (elementName == "New") @@ -386,7 +386,7 @@ struct ModuleInfoJsonParser auto oldElArr = objEl.value ().asArray (); if (!oldElArr) throw parse_error ("Expect Array here", objEl.value ()); - for (const auto old : *oldElArr) + for (const auto& old : *oldElArr) { compat.oldCID.emplace_back (getText (old.value ())); } @@ -416,7 +416,7 @@ struct ModuleInfoJsonParser }; uint32_t parsed {0}; - for (const auto el : *docObj) + for (const auto& el : *docObj) { auto elementName = el.name ().text (); if (elementName == "Name") diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.h index 910cbf5459..9b426da3c9 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/moduleinfo/moduleinfoparser.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/optional.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/optional.h index 9d648bc556..7ea6a3c373 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/optional.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/optional.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp index 54ce8d129f..6bc7f3aa7c 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h index cad33b304a..d2d4678a74 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -120,7 +120,7 @@ extern std::string convert (const std::u16string& str); extern std::string convert (const char* str, uint32_t max); //------------------------------------------------------------------------ -} // String +} // StringConvert //------------------------------------------------------------------------ inline const Steinberg::Vst::TChar* toTChar (const std::u16string& str) @@ -128,5 +128,20 @@ inline const Steinberg::Vst::TChar* toTChar (const std::u16string& str) return reinterpret_cast (str.data ()); } +//------------------------------------------------------------------------ +/** + * convert an number to an UTF-16 string + * + * @param value number + * + * @return UTF-16 string + */ +template +std::u16string toString (NumberT value) +{ + auto u8str = std::to_string (value); + return StringConvert::convert (u8str); +} + //------------------------------------------------------------------------ } // VST3 diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/uid.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/uid.h index 19c0438293..2f8ed8b335 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/uid.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/uid.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp index 551322446a..8f6ff44fc8 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -50,7 +50,8 @@ Bus::Bus (const TChar* _name, BusType _busType, int32 _flags) //------------------------------------------------------------------------ bool Bus::getInfo (BusInfo& info) { - name.copyTo16 (info.name, 0, str16BufferSize (info.name) - 1); + memset (info.name, 0, sizeof (String128)); + name.copy (info.name, 128); info.busType = busType; info.flags = flags; return true; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h index 8ddd6fc17d..f1e7ad4b06 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstbus.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -37,10 +37,13 @@ #pragma once #include "base/source/fobject.h" -#include "base/source/fstring.h" #include "pluginterfaces/vst/ivstcomponent.h" #include "pluginterfaces/vst/ivstaudioprocessor.h" +#include +#if SMTG_CPP_17 +#include +#endif #include //------------------------------------------------------------------------ @@ -64,8 +67,13 @@ public: /** Activates the bus. */ void setActive (TBool state) { active = state; } +#if SMTG_CPP_17 /** Sets a new name for this bus. */ - void setName (String newName) { name = newName; } + void setName (std::u16string_view newName) { name = newName; } +#else + /** Sets a new name for this bus. */ + void setName (const std::u16string& newName) { name = newName; } +#endif /** Sets a new busType for this bus. */ void setBusType (BusType newBusType) { busType = newBusType; } @@ -79,7 +87,7 @@ public: OBJ_METHODS (Vst::Bus, FObject) //------------------------------------------------------------------------ protected: - String name; ///< name + std::u16string name; ///< name BusType busType; ///< kMain or kAux, see \ref BusTypes int32 flags; ///< flags, see \ref BusInfo::BusFlags TBool active; ///< activation state diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp index cabd403648..57e03d0815 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -70,7 +70,7 @@ BusList* Component::getBusList (MediaType type, BusDirection dir) { if (type == kAudio) return dir == kInput ? &audioInputs : &audioOutputs; - else if (type == kEvent) + if (type == kEvent) return dir == kInput ? &eventInputs : &eventOutputs; return nullptr; } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h index c8ad89a7c4..a1009d4871 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponent.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp index 2befbe49ea..c82ac39cde 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h index aa7f63270b..e71b857be9 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp index af846cbf27..4342c7b21c 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -349,6 +349,8 @@ bool EditControllerEx1::addUnit (Unit* unit) //------------------------------------------------------------------------ tresult PLUGIN_API EditControllerEx1::getUnitInfo (int32 unitIndex, UnitInfo& info /*out*/) { + if (unitIndex < 0 || unitIndex >= static_cast (units.size ())) + return kResultFalse; if (Unit* unit = units.at (unitIndex)) { info = unit->getInfo (); @@ -559,9 +561,10 @@ tresult ProgramList::getProgramInfo (int32 programIndex, CString attributeId, StringMap::const_iterator it = programInfos[programIndex].find (attributeId); if (it != programInfos[programIndex].end ()) { - if (!it->second.isEmpty ()) + if (!it->second.empty ()) { - it->second.copyTo16 (value, 0, 128); + memset (value, 0, sizeof (String128)); + it->second.copy (value, 128); return kResultTrue; } } @@ -574,7 +577,8 @@ tresult ProgramList::getProgramName (int32 programIndex, String128 name /*out*/) { if (programIndex >= 0 && programIndex < static_cast (programNames.size ())) { - programNames.at (programIndex).copyTo16 (name, 0, 128); + memset (name, 0, sizeof (String128)); + programNames.at (programIndex).copy (name, 128); return kResultTrue; } return kResultFalse; @@ -606,7 +610,7 @@ Parameter* ProgramList::getParameter () unitId); for (const auto& programName : programNames) { - listParameter->appendString (programName); + listParameter->appendString (programName.data ()); } parameter = listParameter; } @@ -684,7 +688,8 @@ tresult ProgramListWithPitchNames::getPitchName (int32 programIndex, int16 midiP PitchNameMap::const_iterator it = pitchNames[programIndex].find (midiPitch); if (it != pitchNames[programIndex].end ()) { - it->second.copyTo16 (name, 0, 128); + memset (name, 0, sizeof (String128)); + it->second.copy (name, 128); return kResultTrue; } } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h index 85d79574c5..9fcb0e6922 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -39,13 +39,13 @@ #include "public.sdk/source/vst/vstcomponentbase.h" #include "public.sdk/source/vst/vstparameters.h" #include "public.sdk/source/common/pluginview.h" -#include "base/source/fstring.h" #include "pluginterfaces/vst/ivsteditcontroller.h" #include "pluginterfaces/vst/ivstunits.h" -#include #include +#include +#include //------------------------------------------------------------------------ namespace Steinberg { @@ -241,8 +241,8 @@ public: OBJ_METHODS (ProgramList, FObject) //------------------------------------------------------------------------ protected: - using StringMap = std::map; - using StringVector = std::vector; + using StringMap = std::map; + using StringVector = std::vector; using ProgramInfoVector = std::vector; ProgramListInfo info; UnitID unitId; @@ -275,7 +275,7 @@ public: OBJ_METHODS (ProgramListWithPitchNames, ProgramList) protected: - using PitchNameMap = std::map; + using PitchNameMap = std::map; using PitchNamesVector = std::vector; PitchNamesVector pitchNames; }; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp index e1d077059b..c5ad8b08fd 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstinitiids.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp index f30c3f1f18..dd0835167d 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -45,14 +45,13 @@ namespace Vst { //------------------------------------------------------------------------ // Parameter Implementation //------------------------------------------------------------------------ -Parameter::Parameter () : valueNormalized (0.), precision (4) +Parameter::Parameter () { - info = {}; } //------------------------------------------------------------------------ Parameter::Parameter (const ParameterInfo& info) -: info (info), valueNormalized (info.defaultNormalizedValue), precision (4) +: info (info), valueNormalized (info.defaultNormalizedValue) { } @@ -60,10 +59,7 @@ Parameter::Parameter (const ParameterInfo& info) Parameter::Parameter (const TChar* title, ParamID tag, const TChar* units, ParamValue defaultValueNormalized, int32 stepCount, int32 flags, UnitID unitID, const TChar* shortTitle) -: precision (4) { - info = {}; - UString (info.title, str16BufferSize (String128)).assign (title); if (units) UString (info.units, str16BufferSize (String128)).assign (units); @@ -302,7 +298,7 @@ bool StringListParameter::replaceString (int32 index, const String128 string) //------------------------------------------------------------------------ void StringListParameter::toString (ParamValue _valueNormalized, String128 string) const { - int32 index = (int32)toPlain (_valueNormalized); + int32 index = static_cast (toPlain (_valueNormalized)); if (const TChar* valueString = strings.at (index)) { UString (string, str16BufferSize (String128)).assign (valueString); @@ -345,7 +341,7 @@ ParamValue StringListParameter::toNormalized (ParamValue plainValue) const //------------------------------------------------------------------------ // ParameterContainer Implementation //------------------------------------------------------------------------ -ParameterContainer::ParameterContainer () : params (nullptr) +ParameterContainer::ParameterContainer () { } @@ -389,6 +385,14 @@ Parameter* ParameterContainer::addParameter (const ParameterInfo& info) return nullptr; } +//------------------------------------------------------------------------ +Parameter* ParameterContainer::getParameterByIndex (int32 index) const +{ + if (!params || index < 0 || index >= static_cast (params->size ())) + return nullptr; + return params->at (index); +} + //------------------------------------------------------------------------ Parameter* ParameterContainer::getParameter (ParamID tag) const { diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h index 3bc1dde5da..88742e20ce 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstparameters.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -98,9 +98,9 @@ public: OBJ_METHODS (Parameter, FObject) //------------------------------------------------------------------------ protected: - ParameterInfo info; - ParamValue valueNormalized; - int32 precision; + ParameterInfo info {0}; + ParamValue valueNormalized {0.}; + int32 precision {4}; }; //------------------------------------------------------------------------ @@ -212,7 +212,7 @@ public: int32 getParameterCount () const { return params ? static_cast (params->size ()) : 0; } /** Gets parameter by index. */ - Parameter* getParameterByIndex (int32 index) const { return params ? params->at (index) : nullptr; } + Parameter* getParameterByIndex (int32 index) const; /** Removes all parameters. */ void removeAll () @@ -231,7 +231,7 @@ public: protected: using ParameterPtrVector = std::vector>; using IndexMap = std::map; - ParameterPtrVector* params; + ParameterPtrVector* params {nullptr}; IndexMap id2index; }; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp index d7767df2cb..3a47c175c1 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.cpp @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -176,7 +176,7 @@ bool PresetFile::loadPreset (IBStream* stream, const FUID& classID, IComponent* } //------------------------------------------------------------------------ -PresetFile::PresetFile (IBStream* stream) : stream (stream), entryCount (0) +PresetFile::PresetFile (IBStream* stream) : stream (stream) { memset (entries, 0, sizeof (entries)); @@ -780,7 +780,7 @@ tresult PLUGIN_API ReadOnlyBStream::read (void* buffer, int32 numBytes, int32* n if (!sourceStream) return kNotInitialized; - int32 maxBytesToRead = (int32) (sectionSize - seekPosition); + int32 maxBytesToRead = static_cast (sectionSize - seekPosition); if (numBytes > maxBytesToRead) numBytes = maxBytesToRead; if (numBytes <= 0) diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h index 045d91224e..2a9f83fce5 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstpresetfile.h @@ -8,7 +8,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2022, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -124,7 +124,7 @@ public: TSize size; }; - IBStream* getStream () { return stream; } ///< Returns the associated stream. + IBStream* getStream () const { return stream; } ///< Returns the associated stream. const FUID& getClassID () const { return classID; } ///< Returns the associated classID (component ID: Processor part (not the controller!)). void setClassID (const FUID& uid) { classID = uid; }///< Sets the associated classID (component ID: Processor part (not the controller!)). @@ -223,7 +223,7 @@ protected: FUID classID; ///< classID is the FUID of the component (processor) part enum { kMaxEntries = 128 }; Entry entries[kMaxEntries]; - int32 entryCount; + int32 entryCount {0}; }; //------------------------------------------------------------------------ diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h index 960b2badd5..eb715c60d2 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -92,6 +92,7 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-W#warnings", #include #include #include + #include #include #include #include