From c237305f9b692a43aa457d794efc281e480a32e4 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Tue, 19 Jan 2010 20:39:32 +0000 Subject: [PATCH] Removed all the automatic batching stuff and replaced it with a more straight-forward implementation using a state cache for optimizing performances git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1362 4e206d99-4929-0410-ac5d-dfc041789085 --- CSFML/include/SFML/Graphics/RenderImage.h | 24 +- CSFML/include/SFML/Graphics/RenderWindow.h | 22 +- CSFML/src/SFML/Graphics/RenderImage.cpp | 25 +- CSFML/src/SFML/Graphics/RenderWindow.cpp | 26 +- CSFML/src/SFML/Graphics/csfml-graphics-d.def | 6 +- CSFML/src/SFML/Graphics/csfml-graphics.def | 6 +- build/codeblocks/SFML.workspace | 4 +- build/codeblocks/sfml-graphics.cbp | 14 +- build/vc2005/sfml-graphics.vcproj | 60 +-- build/vc2008/sfml-graphics.vcproj | 60 +-- dotnet/extlibs/csfml-audio.dll | Bin 52224 -> 52224 bytes dotnet/extlibs/csfml-graphics.dll | Bin 1156096 -> 1150976 bytes dotnet/extlibs/csfml-window.dll | Bin 46592 -> 46592 bytes dotnet/samples/opengl/OpenGL.cs | 8 +- dotnet/src/Graphics/RenderImage.cs | 31 +- dotnet/src/Graphics/RenderTarget.cs | 21 +- dotnet/src/Graphics/RenderWindow.cs | 31 +- include/SFML/Graphics.hpp | 2 +- include/SFML/Graphics/Drawable.hpp | 14 +- include/SFML/Graphics/RenderTarget.hpp | 44 +- include/SFML/Graphics/RenderWindow.hpp | 7 +- .../{RenderQueue.hpp => Renderer.hpp} | 228 +++++------ include/SFML/Graphics/Shape.hpp | 2 +- include/SFML/Graphics/Sprite.hpp | 2 +- include/SFML/Graphics/Text.hpp | 2 +- include/SFML/Window/Window.hpp | 7 +- samples/opengl/OpenGL.cpp | 8 +- samples/shader/Shader.cpp | 3 + src/SFML/Graphics/Batch.cpp | 138 ------- src/SFML/Graphics/Batch.hpp | 117 ------ src/SFML/Graphics/Drawable.cpp | 12 +- src/SFML/Graphics/GeometryRenderer.cpp | 68 --- src/SFML/Graphics/GeometryRenderer.hpp | 106 ----- src/SFML/Graphics/GeometryRendererIM.cpp | 95 ----- src/SFML/Graphics/GeometryRendererIM.hpp | 108 ----- src/SFML/Graphics/GeometryRendererVA.cpp | 97 ----- src/SFML/Graphics/GeometryRendererVA.hpp | 107 ----- src/SFML/Graphics/GeometryRendererVBO.cpp | 127 ------ src/SFML/Graphics/GeometryRendererVBO.hpp | 117 ------ src/SFML/Graphics/Image.cpp | 47 +-- .../Graphics/Linux/RenderImageImplPBuffer.cpp | 6 +- src/SFML/Graphics/RenderImage.cpp | 8 +- src/SFML/Graphics/RenderImageImplFBO.cpp | 29 +- src/SFML/Graphics/RenderImageImplFBO.hpp | 3 + src/SFML/Graphics/RenderQueue.cpp | 338 --------------- src/SFML/Graphics/RenderTarget.cpp | 151 ++++--- src/SFML/Graphics/RenderWindow.cpp | 9 +- src/SFML/Graphics/Renderer.cpp | 386 ++++++++++++++++++ src/SFML/Graphics/Shader.cpp | 9 +- src/SFML/Graphics/Shape.cpp | 68 ++- src/SFML/Graphics/Sprite.cpp | 19 +- src/SFML/Graphics/Text.cpp | 54 ++- .../Graphics/Win32/RenderImageImplPBuffer.cpp | 6 +- src/SFML/Window/Linux/ContextGLX.cpp | 15 +- src/SFML/Window/Linux/ContextGLX.hpp | 8 - src/SFML/Window/Win32/ContextWGL.cpp | 7 - src/SFML/Window/Win32/ContextWGL.hpp | 8 - src/SFML/Window/Window.cpp | 9 +- 58 files changed, 890 insertions(+), 2039 deletions(-) rename include/SFML/Graphics/{RenderQueue.hpp => Renderer.hpp} (69%) delete mode 100644 src/SFML/Graphics/Batch.cpp delete mode 100644 src/SFML/Graphics/Batch.hpp delete mode 100644 src/SFML/Graphics/GeometryRenderer.cpp delete mode 100644 src/SFML/Graphics/GeometryRenderer.hpp delete mode 100644 src/SFML/Graphics/GeometryRendererIM.cpp delete mode 100644 src/SFML/Graphics/GeometryRendererIM.hpp delete mode 100644 src/SFML/Graphics/GeometryRendererVA.cpp delete mode 100644 src/SFML/Graphics/GeometryRendererVA.hpp delete mode 100644 src/SFML/Graphics/GeometryRendererVBO.cpp delete mode 100644 src/SFML/Graphics/GeometryRendererVBO.hpp delete mode 100644 src/SFML/Graphics/RenderQueue.cpp create mode 100644 src/SFML/Graphics/Renderer.cpp diff --git a/CSFML/include/SFML/Graphics/RenderImage.h b/CSFML/include/SFML/Graphics/RenderImage.h index 04c8f4b0..72cacb17 100644 --- a/CSFML/include/SFML/Graphics/RenderImage.h +++ b/CSFML/include/SFML/Graphics/RenderImage.h @@ -84,22 +84,20 @@ CSFML_API unsigned int sfRenderImage_GetHeight(const sfRenderImage* renderImage) CSFML_API sfBool sfRenderImage_SetActive(sfRenderImage* renderImage, sfBool active); //////////////////////////////////////////////////////////// -/// Make sure that what has been drawn so far is rendered +/// Save the current OpenGL render states and matrices /// -/// Use this function if you use OpenGL rendering commands, -/// and you want to make sure that things will appear on top -/// of all the SFML objects that have been drawn so far. -/// This is needed because SFML doesn't use immediate rendering, -/// it first accumulates drawables into a queue and -/// trigger the actual rendering afterwards. -/// -/// You don't need to call this function if you're not -/// dealing with OpenGL directly. -/// -/// \param Renderimage : Renderimage object +/// \param renderWindow : Renderwindow object /// //////////////////////////////////////////////////////////// -CSFML_API void sfRenderImage_Flush(sfRenderImage* renderImage); +CSFML_API void sfRenderImage_SaveGLStates(sfRenderImage* renderImage); + +//////////////////////////////////////////////////////////// +/// Restore the previously saved OpenGL render states and matrices +/// +/// \param renderWindow : Renderwindow object +/// +//////////////////////////////////////////////////////////// +CSFML_API void sfRenderImage_RestoreGLStates(sfRenderImage* renderImage); //////////////////////////////////////////////////////////// /// Update the contents of the target image diff --git a/CSFML/include/SFML/Graphics/RenderWindow.h b/CSFML/include/SFML/Graphics/RenderWindow.h index 4fc0898f..5f09d4e7 100644 --- a/CSFML/include/SFML/Graphics/RenderWindow.h +++ b/CSFML/include/SFML/Graphics/RenderWindow.h @@ -225,22 +225,20 @@ CSFML_API void sfRenderWindow_SetIcon(sfRenderWindow* renderWindow, unsigned int CSFML_API sfBool sfRenderWindow_SetActive(sfRenderWindow* renderWindow, sfBool active); //////////////////////////////////////////////////////////// -/// Make sure that what has been drawn so far is rendered -/// -/// Use this function if you use OpenGL rendering commands, -/// and you want to make sure that things will appear on top -/// of all the SFML objects that have been drawn so far. -/// This is needed because SFML doesn't use immediate rendering, -/// it first accumulates drawables into a queue and -/// trigger the actual rendering afterwards. -/// -/// You don't need to call this function if you're not -/// dealing with OpenGL directly. +/// Save the current OpenGL render states and matrices /// /// \param renderWindow : Renderwindow object /// //////////////////////////////////////////////////////////// -CSFML_API void sfRenderWindow_Flush(sfRenderWindow* renderWindow); +CSFML_API void sfRenderWindow_SaveGLStates(sfRenderWindow* renderWindow); + +//////////////////////////////////////////////////////////// +/// Restore the previously saved OpenGL render states and matrices +/// +/// \param renderWindow : Renderwindow object +/// +//////////////////////////////////////////////////////////// +CSFML_API void sfRenderWindow_RestoreGLStates(sfRenderWindow* renderWindow); //////////////////////////////////////////////////////////// /// Display a window on screen diff --git a/CSFML/src/SFML/Graphics/RenderImage.cpp b/CSFML/src/SFML/Graphics/RenderImage.cpp index b4404aef..c1ba674e 100644 --- a/CSFML/src/SFML/Graphics/RenderImage.cpp +++ b/CSFML/src/SFML/Graphics/RenderImage.cpp @@ -87,21 +87,20 @@ sfBool sfRenderImage_SetActive(sfRenderImage* renderImage, sfBool active) //////////////////////////////////////////////////////////// -/// Make sure that what has been drawn so far is rendered -/// -/// Use this function if you use OpenGL rendering commands, -/// and you want to make sure that things will appear on top -/// of all the SFML objects that have been drawn so far. -/// This is needed because SFML doesn't use immediate rendering, -/// it first accumulates drawables into a queue and -/// trigger the actual rendering afterwards. -/// -/// You don't need to call this function if you're not -/// dealing with OpenGL directly. +/// Save the current OpenGL render states and matrices //////////////////////////////////////////////////////////// -void sfRenderImage_Flush(sfRenderImage* renderImage) +void sfRenderImage_SaveGLStates(sfRenderImage* renderImage) { - CSFML_CALL(renderImage, Flush()) + CSFML_CALL(renderImage, SaveGLStates()); +} + + +//////////////////////////////////////////////////////////// +/// Restore the previously saved OpenGL render states and matrices +//////////////////////////////////////////////////////////// +void sfRenderImage_RestoreGLStates(sfRenderImage* renderImage) +{ + CSFML_CALL(renderImage, RestoreGLStates()); } diff --git a/CSFML/src/SFML/Graphics/RenderWindow.cpp b/CSFML/src/SFML/Graphics/RenderWindow.cpp index 6edbabaf..fd0410c4 100644 --- a/CSFML/src/SFML/Graphics/RenderWindow.cpp +++ b/CSFML/src/SFML/Graphics/RenderWindow.cpp @@ -285,22 +285,20 @@ sfBool sfRenderWindow_SetActive(sfRenderWindow* renderWindow, sfBool active) //////////////////////////////////////////////////////////// -/// Make sure that what has been drawn so far is rendered -/// -/// Use this function if you use OpenGL rendering commands, -/// and you want to make sure that things will appear on top -/// of all the SFML objects that have been drawn so far. -/// This is needed because SFML doesn't use immediate rendering, -/// it first accumulates drawables into a queue and -/// trigger the actual rendering afterwards. -/// -/// You don't need to call this function if you're not -/// dealing with OpenGL directly. -/// +/// Save the current OpenGL render states and matrices //////////////////////////////////////////////////////////// -void sfRenderWindow_Flush(sfRenderWindow* renderWindow) +void sfRenderWindow_SaveGLStates(sfRenderWindow* renderWindow) { - CSFML_CALL(renderWindow, Flush()) + CSFML_CALL(renderWindow, SaveGLStates()); +} + + +//////////////////////////////////////////////////////////// +/// Restore the previously saved OpenGL render states and matrices +//////////////////////////////////////////////////////////// +void sfRenderWindow_RestoreGLStates(sfRenderWindow* renderWindow) +{ + CSFML_CALL(renderWindow, RestoreGLStates()); } diff --git a/CSFML/src/SFML/Graphics/csfml-graphics-d.def b/CSFML/src/SFML/Graphics/csfml-graphics-d.def index 7f204479..8143ce15 100644 --- a/CSFML/src/SFML/Graphics/csfml-graphics-d.def +++ b/CSFML/src/SFML/Graphics/csfml-graphics-d.def @@ -181,7 +181,8 @@ EXPORTS sfRenderImage_GetWidth sfRenderImage_GetHeight sfRenderImage_SetActive - sfRenderImage_Flush + sfRenderImage_SaveGLStates + sfRenderImage_RestoreGLStates sfRenderImage_Display sfRenderImage_DrawSprite sfRenderImage_DrawShape @@ -216,7 +217,8 @@ EXPORTS sfRenderWindow_EnableKeyRepeat sfRenderWindow_SetIcon sfRenderWindow_SetActive - sfRenderWindow_Flush + sfRenderWindow_SaveGLStates + sfRenderWindow_RestoreGLStates sfRenderWindow_Display sfRenderWindow_GetInput sfRenderWindow_SetFramerateLimit diff --git a/CSFML/src/SFML/Graphics/csfml-graphics.def b/CSFML/src/SFML/Graphics/csfml-graphics.def index ac75f1cf..b4a35a54 100644 --- a/CSFML/src/SFML/Graphics/csfml-graphics.def +++ b/CSFML/src/SFML/Graphics/csfml-graphics.def @@ -181,7 +181,8 @@ EXPORTS sfRenderImage_GetWidth sfRenderImage_GetHeight sfRenderImage_SetActive - sfRenderImage_Flush + sfRenderImage_SaveGLStates + sfRenderImage_RestoreGLStates sfRenderImage_Display sfRenderImage_DrawSprite sfRenderImage_DrawShape @@ -216,7 +217,8 @@ EXPORTS sfRenderWindow_EnableKeyRepeat sfRenderWindow_SetIcon sfRenderWindow_SetActive - sfRenderWindow_Flush + sfRenderWindow_SaveGLStates + sfRenderWindow_RestoreGLStates sfRenderWindow_Display sfRenderWindow_GetInput sfRenderWindow_SetFramerateLimit diff --git a/build/codeblocks/SFML.workspace b/build/codeblocks/SFML.workspace index deb7b670..ba1c7269 100644 --- a/build/codeblocks/SFML.workspace +++ b/build/codeblocks/SFML.workspace @@ -1,12 +1,12 @@ - + - + diff --git a/build/codeblocks/sfml-graphics.cbp b/build/codeblocks/sfml-graphics.cbp index a9b2275a..1569faf7 100644 --- a/build/codeblocks/sfml-graphics.cbp +++ b/build/codeblocks/sfml-graphics.cbp @@ -127,16 +127,14 @@ - + - - @@ -148,14 +146,6 @@ - - - - - - - - @@ -167,9 +157,9 @@ - + diff --git a/build/vc2005/sfml-graphics.vcproj b/build/vc2005/sfml-graphics.vcproj index d8d041fb..3de75f7f 100644 --- a/build/vc2005/sfml-graphics.vcproj +++ b/build/vc2005/sfml-graphics.vcproj @@ -3366,58 +3366,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3514,6 +3462,14 @@ RelativePath="..\..\include\SFML\Graphics\Rect.inl" > + + + + diff --git a/build/vc2008/sfml-graphics.vcproj b/build/vc2008/sfml-graphics.vcproj index 1954e795..6ee2f135 100644 --- a/build/vc2008/sfml-graphics.vcproj +++ b/build/vc2008/sfml-graphics.vcproj @@ -361,58 +361,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3513,6 +3461,14 @@ RelativePath="..\..\include\SFML\Graphics\Rect.inl" > + + + + diff --git a/dotnet/extlibs/csfml-audio.dll b/dotnet/extlibs/csfml-audio.dll index 48d1baddc7946917868ef28c6eb48994cb7ef051..fc371fb7d718c9ff30d397ab07a032a1e8b00490 100644 GIT binary patch delta 313 zcmWm5F-U?@7=_{QdLslQh=zs;jEHD*h=`!ZhC)elOE-t0aB7hh6M~e65N?TE5`^i$ z2p4K-Q2&H1C~IkG2*N>XcMN(P9(Xx$vL&4@>9W${pDm+RNMC-6ji|Tu|6u1bi{7#4 z-;LD5QGY#GHLd*<@3O}xjvxGblfzPF+QcfaDs1MjyNAh!NC6I9d|-f)rpOFd5JVhl z6i~)3I{3l>zLv-o0tjLoJILS^SGYkJJt$XX+?9ylk4JlK`>%tEIUu7(*JHb#r%qZ-T0;#HcWD=A*bRgs(B1j}H3&0K}ti8UO$Q diff --git a/dotnet/extlibs/csfml-graphics.dll b/dotnet/extlibs/csfml-graphics.dll index bc4c4a69ef9f7dd3c0850eb05985689b6870c612..ea86d77216e1a117bbb1d28084e1413c77922571 100644 GIT binary patch delta 179275 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

YA<`>S6fL>X_M#@2b!Ja0ZYB;*3>lkJ;+ zCmTn4E?VTk!*@*>!>td`aEnR8mam7iURee?ilZOyqG8xV9F-IS9*13^`c-*5#{y)n zJ6EOgRryf$l3GaDtMaPK1A0>x<@?K%nnHJ|*+47^$u(adR+3!?B;bzF! zTd*CVc6Ng*VlF;GyW$ll^sE$Z%h9FFuCp(dN4QcxF1_^Q5>+CIw-rm>cNq~Emqg5x zq1G4?H=%1}MCqkx8WAO*2pRXPO$uIq(We?Q*8nH8lz#d!Bc{A5g9nskWa+C%8Ik9~ zDkDo@y{!><8muy|^wI;2xM{G;h|){xcUl~^5iT))RJMDc$-lNGIx zAtz%>q>kb9tOl=Ve&Q^TrW;(R>NUAv>xZC;_Sc}9?qJ>P>%l)89W6z=IVG=Tb*^u3 zVby)$0lvcBZX88KMeDb&P+Cpiroy>v|Krj23gy-0;cmxK1kf5R(G~3B^{x8LKgr*Z zw^Nrm6jG8OuT^Cmru4t5_i3CzVshfLZ#WI=VfNIH`0?3FA*Jco_*4lOX5hzG*XhI;7y0 zSg8*$FH(%iHzK;DthwRckh;SF&P9 zIy{KIdrar+@YKFrPrNHS{2B!?&n(1iKsX`k+$lK<0u^&ywEh`9CB>I59cR_k;6xt2 zaZy0}>Eoocr(a-PG@OC@hsA+|5jX^aV@}W(f4;{tJ4~(+M2U5IZSxMpk<^El*5!50 zD-2i5K9pORr>ehVnTpEi6=^^{Zcz`yHNGBJ;l*Lvo_hQPrZy;3sIdmTm!e((t?S>A zuT}$LDQd{qum<>`>{2JH+nj&MYT<4~b3U8y7jZAQF*l4c1#xF-Z<9+4KGmaZH{;%m)Si3qb9%{W zG1T!%Crs;{?`ca5?&nff@-1jNt6WY(AJMHAyc$b;N`)=JKS2FGm|vG={X3X1kmmfB zJYH!*zqaIcS#oD`ZN)vR);@~HpM3|j0L^Q)hYy6BNaAEj_oDRt9O~GLkCmM1cdd9@ zm0T>N^2)lU^=+4o&2mcNI{{I>qV={n$l99c`JH};uG%vaKAGVdmzLJYhUQ{dZQzi2x#XBz1 zAzXIxkh^rU4UhCpDfL3Jc}g{`9vsK(E@!AwTRxo?ywbjD%kiQ2BX^9!WDL)fw$9d+ zDpDkHgT{sOiR`-<^eB{1VA;1R0h+QbCXe#l^K7=@9Bu1>UU+fS=pAeg%<>G?B@Vai zT`8m^4@kXy7U@Rz1OtpiJF9+NI^%kQpd|Fv_en>1H+j6*OW$e)94ycFy4eyUYzd*Z zgb;nH#4b%kqsSG>d1S0hM*4(a)P!nLzV^x04D;!UZccLynrQ#Ykk6al)`?0M%%)%LPR~&x_9RF z6m!NEFnRizY)Xyb9fFpB{jR9^x|A^%@m4f03&q6SgF!O~oRszR47x6hYqljg9Qj6trGzZRO25+Zss|dSWd<5J`1o`KRo3Bz+glso~{r-0}k8(w$p^ z0d~M504^?Dt^z7Wa!XY}AfRKUHZ_iWDeUzQS{jeJwCp(TiN``+E|-3f=gru}rR3j> z`&R0?6a}*%K%c1C&Z619(MXMU(12bbyBCkq$G!M9w)Ygp^+u#|$0)Nmn3S{MPop6H?D815jv1)76okj|sAwpx z24&EeB<}0yD)HT$+QR(ND1per0SL5;EvzZ{Vs|jQV?L*6Nj$=Me0&72>36geSYZhC z%`wJP7DeadZ8IYDsVm zxNqaCh=XoG9Oq))|5&{YP#AQ;2Apu2^$?BI`pqA3tLu_t&3EC*G+u7V@V0 z9XJs<1c5^l_8)aJ<#}2D74q~Cd;H_U?NR=n@4azF|VIrTxe)$>?vLTCuU(=vT zydB$`Me8QO$O$f%7eW~0WVtkK~fsMU8){<`|Qtu^E^Q8g=mZEPq zNmQ6bEtMh*Q1x%5m)^vPC^zLYq9IN30m}A`MA_#{N(@5hY($h>g`qO0#M-{8k6-;y zk{L@C92sAR(CC8rs@ArtGV@0!fW?yBrj1n^ z&E>0o1MTg3VzGwrwyE!m67!5bRFjV>B%KHN-oZ51eaDtGRZ3lCWtJSKj1Z;APu1q6 zLz=)2CDFMIzJ+}I0-*LJxrCw%UNOI!thK(Rf%vAA0&JhQh0bRLRc! zSe8$hm61=}W5=c6Or@E2(7E_j+GqzcF-<4k&Reiio2mLd?#{Gn)M6g5%FMH&{=@@a zzFHvbh`aBeho_T-E|X9n9sjq_9;~JGrr&B+~ktvQa%Trhproj>R0r~XV`7H z&ZnwbSmg7vXml2z%YL0nud`4|=S-+N@fsBqCzY0j`{AyOvs9JcFopUoz{tBkh0+)B zdhGTF+P;8aWUV&PtcBP}O-vv`a>UWT$!>$38PB(ey=V zv?}Xq{UV;oq9#$f#oVuA0CI&0Fy9T;^fkg-b!{SbUd%sYM{KlpG54nCaX+DlxPV1uo(BJU{$zh?HT5 zZ$U2_FMWOg$G4W@>l;tImvBGVS<{etn6owLWxOrLtfx$)M@#sZtlD_WT8c%gXEJSG z3O2DtGUYDiVXR;Rl_xB2c@wB1abg>1Q!ep1Ry3P@mVx6tF`k+)AN|H!{ku~;`QTos0Y1T46)v2JLJXrgoppWMGIe)8E{#p_U95;DqJax%fhl<)e zCgaE}I-R_iqj_(nQ-|dsW+9_!{Br&=8#9rfE$7YM9*%rh6q8txV6nu4R{HCe(y7G? zFxAsW()bnp1RFnsLRRvwtkwv!t;E`WcbRr`B~MmZ*$EW0nt#W7j;AtfcyF&a0YwCiZk`f|NkoaCaO{U&AX^Iq{GGcynn0X9Uy8`&=~me?rzmG5ucNG^{Ea-p{ZE6invtlVj3n2b;naT<4|98r z!we7;6-j_Zc<;lqyL%Iltoms&zV4xaufOtsp&M3T^7)!qX~BvUeTlV`rL?ezLF$zp zn8Xuh469xdpA zTlFrhLB;U^cT{?Ar+B@7Ut*j2&gycJgZfE`lwx#J9i$Pi$nR@~el&b^ithCpUE0hi zILakaUo)Q~xA0aq9{h=xnlBp7F9#YwS+t6w;o;qA^> z3h0Mu#cqsZOSblEH=kXGoeLx-n|sjWLpW;utr6uN;*HqBMiN<@)e5A#+2DuOK&@*w z*93c9pZIZZO?|PMTekgx6k$4T;g$-3s(?Cx#sKNp8fF-vM~ORiYcYOyiJ1v=F?WtpQ2sAAh*mzCjW*-9kyB5+v%_hORE#)4(u-hzD2V7qy?1%;jgyRg0mjX1-*L_5|1aRQyNso3>I zTlH7fF^xO&^k)j_XL=4E0!#e~SG;1Q^qcT8LQ1t{Zv;Ip5ys187N{^|Zd-Ax*`hf) zp58NH9MDE60`7QjmF#5Sm*II zX4RuyIIjL9s5M$2+2I{6x~Tfm#&bBT_oZ@qym`q5w_OdWYaUKkPaKjb>=`cyK-LdF z8`-#9p#$5vgKQ6H$m!zS6Xo$n&W5ffSb4ns-GDCS;b4E&59E8E$FM1(lyV-*AiqYE zexBEiYWxG9uTgOXFIT|X5t0B`lcFGBwPWfyX~1j*Ku zp%ik7w`O;S(v(Zsb#DwJy2P8X2|@IuG*g49=#rF-g;15tyo%S-uILBIWE`z~|2%)boBi-+t(EZDxmmfAE?<-)b?=_}=S3riWUGU9S zNbN6&)5$A*k@@XVsS0&q3l07WvH{2ne*KBBQW7ZRD!7P+ohjrR4`q4%XvQ`0l^grf z#%o|(X7-~q(%q{cy}ZURvzdLhGe2`hVKdw)?>czuL^ti%>)cOaM>>-8O}>&PwxBIH z!DL&8(J5*2VcMgcyu8AeSm@0y{y-g5{vF-9&C}Gk&hO}>JG>Wb+?WpD;WhlrHAc;6 z%R@4#FZ^&7rv6tTQ1gAUx@Io+ujI|Yi+Z;W zq#bwpm1^N_5w!sA=xYmn- z18fDH1pEv*cZVkG{A|CgrvJ}Djg;?v4^J$brShGvaAG)@%6C>u=RfkD`Ne@tG$8b)yFPdSTZ!BB@B%ef1sG&@gM-J z7Sh0Hkl$Eq(5h!R0RZn-u>h>CJRNcWgZHR5ydh%CGr!`I>5?%3hv0}^KMu?JG@AJb zXj?rWI{F7smxcM@PkeP6%lGc*SYnYz$O}G4iJ+q|crCoG`1l3i?kLA(yq-#HUh)J- zUz8LVzDc~|ADW8~jdt2;%q#xRc`vw#jBGF$?t2GllV5XJg&l2A_BR;F$L4C~{^D&I zW39AqZ+T^-xWnG@Wim^pkgs-3IC zgs85&gF(9N9W5ZMe#YZ5@@&o*srsR<9rTe7??@HGPYr{mo)EEaD<8j=L&dXHRGayj z76{>8XN<&SuW0LNv3HbYI{^sLc3VeDvLm99A#Ruy(j_74ut5d%PKZ7=YB{5iBE5^x zUi@qc{(1#qz_TWJON}5C=G+vMNKk&Ft0wV=m2E^99Yq&5;5qr2MID#f&)*i=9P#+Q zf|X~=bBZ;K7Odb;nr{}B%1CX^Bn!@PpVM};sHSdrdPjL?(VeyPBp)YHnf3IbR!(BB zx~7n8$DD*C_WADG*)jqzWfk3{+hs*eY8Q-raDBEd@=kQs zU^`wzP8hosV?ivoWtMC?7l~RVOdMdn8eINhxGR;}HIe zL@km+sOVJS3@Vai#M}U!j4A!}9Y)MGlGXqvz4Vnv%*C*#AMGS_mA?8MBknR-WnAg2 zCmV5R!7AfQFMW^^cP^|lqV&=uMR!?Vxml4hrJvr~h*@%czeRfK{zl9+SY=G(_})XJ z(i4HQZIK>mAtv6@^m3wol(9DE7C)_`A1*)#X55hhB{4EKPbEi|v*A^;E3#!gK!|_# zMkC-AYs-*tRq8#Sl1q6pMoRtC%8UO>{fu2lvDB}Oi>R$se_I#j+BOo2WroSInf_Xp zI{{xuhe?TGpzoL|$|CwzPem~JCO|)+SXaYdw9G6l698KQv(0qYB0i|T0Te*bx+h0D zj@?s&q;{P%PC`mVXvd#Wu&Y?dF8I+6S5cE~^CQJgTvx}IeMh(51fDUdNzE&WNakOY zW>*kB*@YT-2t;JE33$rYU5rwbF<`H|i(s$e@7@;W&VG&R%DNt|`5#X=Rb99Mx7< z7H4pV1!6Camt*I)$ zVznPqL^UxZKJNV6q8O<#+EnifE6USUJ%NWDFTmd48+bfb6}4EKJR0XK zJXq~Kn(Hg#T-%<*0F%5Lh8IR*qjTCbUolQ;?kz``yu1TSqq|54US5F1Q)kkF_a))5 z=r5khV7T>(b5dP@MoVjmLF|_b^rnWW&W=QfVC=wE?m))aBw zzx)l6=`FepVu#hwVcJ#~;8&jqk4()$j{4Qod#G*oYl-g!siVE~G{`ZMWYo_LdJ=0J zFir3C8~OQ()1e1`1Rl@jx@g^*EevW(c>fK0Oi}uJc;MCw9s>&pFDu|G(RB)Qwo7!R zRAl=zhP6LQD{G-1UMK0ObdPW)wYFI1 zaW@~)=I=(aWqWu^ea^G_w4*kvzCEAL)fN>Q<WJYg z8~Bn6>xmky-$SiNfB=W({R=gzFBVj-d_*QI8^GnzQh%hL=n#r5qM_?tc$n_g7fo21 z9CB|U!r74{)USaEV`Xz_eFM>tZ976rLvevQWz*$`BAA^!L@td)Jezok5*vvItn(p_ z8j0O3^+Y{6T!S%O$NCFPPO){(Ki1H?@3EGDta<+g82b-)%|BKLB%7199KTZmUjecJ z8Gtc>oqz)Xe2D2(6XE6bBtT%BzT`##J#8YYIUTKUICs=1_aL#!)djwufQo=>0OLYJ zYqI>Qa&m4eX1O&7vIC$CARaI#KwH;TR8ZQDZ6GZB2jVB$+m;oAI_9QD;5V<1taCTm z0#T2AFWcUK{2YKO_Otra^Jbz03v58a&Bbs>na-iH4QNwykSvD=bf&qe*DnxA``o5T zYUUgCQ)qDp*|py%f~-=4hqiu^Qt|)HyXw%Eo9d%yQ{0Qa|C4=83o+TvRl~$KIv%g^ z;9i!Z;msIP({f|adpyX%**%&iSkzIJ))d@Qe9ZO^*S>2h-Z-;{n`lS4@Me}x+SzdN z+Eh1gour8F`9tlM0xDoegu{)K>VU5DJlE4c`wpss8PRB+_N==YBr45Y4u9~5@NEiO z;hPi+-$~19Sd6IE(pv243-%@?DHJ2~s@|p;6{t$~w5i;X21ra#+z!%#=@boyr1Em@ zSd93Kv8v0o!*K#%7jLwbw)a9Yqewf`OSBcu2i8IpX7ohE?l5eYnqE?aP`_V;c)aGUcqw(b* zY)CcFUpxGv!2RB_b+z!pSfadk&y~&PY%@KY2Y)+0DP2)kRKGEY*f6n$jhRc^hlzG< zOz~_KHfO7yH@B)xHP*{|{!crbk zrLRb}1i-Rxkgzm^*&bj8^Z`r;%myrn-(r~S0N(<#0cQa}mw*ma!pjn1{e(q=r39+M ztPcn-fe4sA0iz5^6_$@-u>+O^egru57nUXfYYFs&IkE&M!;~-^un@2cuo>_@;56VS z;5R@Kz>**=jRDaBS;2uY(*SD#-vAB(e#A(z{0w*i_zh5TfUqyKBwEppi-=Oa|ac*b?y#xvVIQ=Agg zPZaf~9-~AVma~HTj>7QmcalCCC2D$1DvpBSv#!Ta>6m^$RiCwj_Ky-?rbOwbQMJ*c zipcMv`>mkAMu}>SuYk-~^k+j((3H_wVJ0r8O`}C;)_pnsK3W7Yhvigl3^pNk)>Hf# zF~m3Tn-b0pgavAykU2|zu2Wxts)3#z`GRhY5e?aeU_1+UGQ9EV7*ey`-_ix6z8V2-00D zd#3+}Z%hB~EL&*GZF{U#nMsAG6lI6GOKgnZ=o@kwC%Sv)5hCf3qC@?DaUyPDL16B$ z|Fw;h$6>0w9-}kkgnt}u{ijAan`?v`1r-%5$i(QME|W#`Q;*sBzLGPx8NL%A=C{i1 zX(G0-)juH!)$FK?yc<3&C8!BJW=UR3v~i03d2<{GVMNf|G-vi)4P zhkN3!pBR1L7P>qhi&Q6~zs7^aShiBb31S(m_%WTBAp9B^OnqCFC{LPkuJr)+{91PB zM)pSmk7EN)82Bjt%)f#ho=R1d#kUpvF9vfaH^Yg0lZubI>g%@6^h>gs%!;wTMw=~!yfb!bs5?+ z+0TEXSFGL#7<(lf|5nzje#x^j1=D_w)$eSigh`?mJNh+!F-g=^&e0E(M3fX&xlR^U zYFM!C$gei@uc;Hpj=__=4qUp+&-^QS^vDS*rd)@&NfbF**gU`c(rCQmy96ow?E`!R zeB$-(3+UNoG;z*Bsxk#rVZ}k}0JCPwK^gk}ojHG(j0so?@ML<{+oE_Etw7(MMW0R) zzAg)aD7kFWRL{tweN(XZ49%jeQ$&3hoJFRo!jHLSQT?gn4zr|C`H!(i9ZshHAB%eK zFN!-<&QU9V@Y?qMrL_EGOq_}H=>$U5?y_E%gJUhm8Vd zN}kii5H?^xrA`y=ne#k4G7WY4axFcYhO|!Xql(kvUb~Olz^pTM-+$^Bg8L{~q2l!; z^JG;D;%&)(z4Y(qk!`vd?$X6T=EXyL+)HmWkCYi;^}XiF`c$EIGem&=(#8x?*}T_o zlr4mur-Cpnv};>ufE#n~KlW{r!v91C{9F#jf{)d^j-`vKBD(6UF*3XID*w?%t7zjF zQ5yv5F8PofW2i%#Xk622q0wicX`XU!qUye=`kxDos>?4E=?iFSnh0(3l|CCGf{T7fTqn9 zmFqo3*J6l5eP;k9@0em&fWUN?p}qB!aKyppryt6qLo?CNcp>G}*sr6UxPJ>#gvTJ`or=;o*5JXK zDNZTX4ZR%DL0?_PI4b$DN^(37M%?B1#v-R^X`cz)@I4K3;E>$lpfvFyGp^#{bk!C5 z-FSNB9sQ6cvRK2JWL+RCyWGc6&!lCT=lEvim3i9a1!6C{WF0kGj5$1e9raoaSzZ5i zG;^`=XF=;|%VH73tcgpP2*|_YsKyd8gH7v0>z07(SrfHpO9eE5r>>^KB>E|*=`exN zESO49No-=Bq5HKAllD$56)r>a`(w%PbFrmtxmei%_?`ogrJp~?Ca>RQs_}*BsQgVs zzYyOrb1YR{4w`FCr2flAM3p(C(8wKoV)FRg=dO_5q*#q+xfQ2nFBkps#!RB-vr>Gh zG`RhMIV8&ST_^_hm${%RTr#d8PD|lC3J1biRa|BrhkLK@DEej-0TGT2pgBvocOrC+TiK|6jmfsH_f)cG6+rNKtg(_dR=2;-9z zPz`fyNh>t5Lh+}Td(j2iEwqHaqCjD1n~`|OV+%ZrtcS58RZ=m3zb&% z(GM6XKhg0YL^Gu^z5PLarnu6)Ln2)1Ll+N;Eajv&I9qg3_)d2r=`DpS%Mu3A`K~%?)-}WI3gO?d4#tl;&54a zC*F>brW3R=AZnD$e<7Rp1L(NB{hU65y5xv;N;W;s5qp&S+J>W|fVuj=ueNJEK21`& zuJ&cFU`m_ISB*3b)ev8ojL%U55T4+qK#;|4`&qF%(DXvv41e2<`a|)`!cd#3WNGSB zM|*HWY*LgvlzB=V02%J`qj*`)9%T-Q;;NO~tmYhQb6WIP!ZkeRjDTmf(6a(J5SG8C zMd!q57VwtTJW<2f5wCva2e=$^bvb0Re_#%XG~*NFE{Ea+qhRWvSJT4sM4(dXC%pJ& zG}ln0xh%!ab(rRz7eid_xbFNf9{FtKE&P;AF$Lv z^rizBMYVE&G)5F)ahGIHV|sW|RIT6-6i5;h>J*)cPYLKaw5xPUY+&Q?>iQ+oi*5Xn zDqRL+Vco_cv^Zc-w9kPR{M}*+-Q6EWP3cM2+?{y`sgy4e7l#n=&~rIu_DjK2-N6CSITqMczbZv#QaIn^+}oRiiaGMe}OM-DL{AWl&0G zJqbev@^UwOSzC|f+|HBpNPB)$bW>7u6}?>P3sQ0%tc^&J-}`?5w_dvcb;0U?zYmVt z!-KN(%_R@(XW5-ILI=BA@Kml>#>r%-(Dc{7)AAAD=5F9a*JllIwd|D>*2tvg>1+Dc zWIukbs>S%u`04j<_fmH!>FZhIg1_PR?m+(cAcj9r{qCXaAs1-gJ>diA)_bA}jNA8w zCqIu5Q&PwiQI9M|!bAc0#mN7~{div_TM!QPAP38KJO=5QHPqvQ_^^(Fm7*(uG+Yg= zeS!FPw){9c+7vgha)oS}#iQuz0} zg{3th0bmDg0-OQVyCLvwjIg|ceHYApKrJK}d6UjQ6rre$i!LfzN;7_+Z*yJruHb9I zcLs%Q9X)O(bGTX#4YN)cfhs)cvMy@i>(8%s(Ig7BF`l}>{u26!Db+Ew{qfs?Zz%aZf29BeTABlEVWG`KVj1>6?tY8ks z-ZxGf0WLoh*OC3s$KnNh{5fsPhoJ1M&*@3NsA`gJw`ml)JP{tsd9BtHF;QW7zIo+S zY`S0;JQY8dhB^G3s3dVe|Ax)Zr%TEFOf-`26$QeFdOZ`jrK4p54hf2pwb-YkK z2ZrQGbS-5U36CY4P42a2NdM9AL+aJ;;o!70Z=I9k-WNBYjT*llwd8@RW^s`#QZ>ai zpx9oE)+?r}#rEE%s8D8V=Ot6UgLW#(|9wj6!q1uMHNq}bO>NQH=T%cfqu`hrf}4Cx z>lMIFHRLSq!A)aIaN1FBnyw;F2eau0Qt)vy^=}>cHzq*y^dgqxlp9_UDqa5RZ&-?V zdJ(=W4pf#zd6WhSd<&N&(0ASn(ws~IesY{c<&$IJ`es~D@r~8-FpVUG@5{V+lx8Yp zTB{hvu#To}Wlfb?^Qm;AtSQn-e!vWE8hU|zoJ|c;xJYM{CtEs&5}i#66`D`Ms))4UiG3z{Cb2ine{Jwu)Lg7~uH*62!J@-7hmqW#mPp052`6kHjUDTSxU<|a5R;7Gu5hK5F~l(S+1lXQIl{t(xjtF`OqM^>rLxZWy%ddi<(@~5Bt87O}S z%b!I26fa9Or;6!J;}LK>qzHWtde`{AU1qp%qAZzJziGVSf?Gw&J(GMh=W{dKxEr*X zyiK)O$Y9#)ZJLPTRpQsjf_C zbTv~)<%0HYHH?$@3Ay84l+uI(OA@l;#kt~y1{(>vmn2ldw>Y7;z9uUQ^qH?|ta4## zb<gC0SI%(&o90=Y=?dBI)Mg%Cn(O$`KiJVP+W{+iYtOoDhpptXUprwfSz@?EAeNvuwUJ4?Dm2=RT*D?f?CL zfB*mgyk4Jk-Ph;(T-WuvKG)}ZehL%gR5rB>%yKkZZy1ha#aw$NlMjd#dvNnuanNI1`*9-mKBkNl6CI5s zMC!D}jo?SeiF358VdYU#Vz+&xqC`@>(a~b(Ht!D;vbFupii?BeV`T$IBA zsesk!9!87D5N`5#(I3X9@#4x*$`?%-Q z?NUXwlW5?gCy0~PY%5*B4@?j{so#YQ_!kqzvFdl`0^Zpmc6ywfm=VfoGkvNpY~*H) zLF^9Mq#MMSNn&dDb&D03sNSO%@WNPewM1(6nOhq7ohWVw(PtA?v3@gA?9(VRFYX&B zwx(W2NSqiz=DawO#sur*)C%?=abhJxEk}jG8Q7dD^O( z)ZIo!28HvXaza*9F!k3BmMf_F^f8tz=nFPgbzW(F@)U6)l%aBpS}N?OiqBA5W=|DE z8q>08sx>X;Qy-^AKTYhw8q>muO%vOLtI5;EAYy&vG?99Ob<@PbV7=FL(TiA*N>X`# zE=lFNBuOlJvNVC4ycyyq&~{1|H+VL6tI#{E2iLd^%EemnbJO_gWU&v}u1^-OB2!`5}fWKkvvn{2PxuMco{Vtjb&jPe{HrnO(;&|f6Nwr8;g8X#W!h=coqrn`mD9$dsh5FvMRlN z!_&0F&6o|wu*wyMgOtbI&2|gW1&2(%(?mR(7TT8QydY-7yLO@YIgF}>;(2f63Uy^M z^n_mdphHR7Z;B>lpv5Xb6rZw1;ws`XU7Xdd+Wt6Q3<35=y7&r$Talr*VXu?Xm4@Ie zI-7LIXrzvLr+CXngor2xjSd}LFoS=ySPU1!Q@H1gVs}+@D$>jmFQP@(t3JD6kpH^s z)ipu&N`2D7BSJgF>mQlo2=Y2)iLK44NaJ(y4Hh;oQA_N*OT-nnKzYBVVp-$&y`|!4 zPz`-arJC}R*tJ<=R=uPq=IBdemuA=>{uVoYnM(W8GO^R&>7A}g?>=4zzAp0WWn!2A zOxR|*N*J^8KyCO1Hn154Lf(gQFkpuqr>^KmZOR80@&DBJN40}TUA^;A!y_M#@! zyluJYAhdgkN&^Mj>uTlI&%ZlYQ&wGBEeZ&Mo-`XSpUK$g}$M>WCnp>Jv(&oxoqt5&PS>vlGmRbHosVXlX{A`h2%8 zSo6O24KCzmxQrb%$Hvk7YoA2 zm(5Yz#3(x<<&t^FcCodckZ^(T+kp=1!z%v64sqnjgH;%Jm5)Y+h#6mx3$*JNy$K8q zVrX23_YmktnHgH;7tp1~(J?*`otWipt5 zE*ZL7)sPGF$mXV5M}|k5YIqv*$)+#ZK!#WCMlyWr3wYIQVxPWVkU`#yT8q14EwmV% zPsC)VTP#Yv9Aor^v*8SKJk#QS6BX%B(O@ss9_CBl5LXDbN6de`AqMLFs&*mFaIO9g zGMK)Q44q~-8M0nA+zcv-N5L+hctGst`=gs3M8L9-7m-9V+Q%!mB|A;LV!~h$cXTSB zV2>X}6t67(jqg1m_Hj)5Nu$Blr5u-r9}s)AT6mVms_{yz6I}bgc)RsI%qipk_jtvb zZT&#>6|PCV?+4;TM?d19-Z|$1ABy9J{k{3B55;l9ub26kWPjr_?^+~g30*Gp!Xhz7 z`1}(8y-188x`7|TzDmp2e?*mvmY@GfoG(<_^C2ILQv$LPY{IjvF5;}7*i|T8$d7$04iYjK@;^RB%YgH-UI)c^!3Sgq zF&E&rkn@8m0?G^g&_TFget};*D5mR^1L*0z7+QRoNB6esMqyWf`!#nLw~fcO0^9Kj z-ysyVn+y5-hs3S)_U}lu*i+d3C&z@tXn`%_hs`|Hfd|Y%Rzdesz?ODgsF@ych z<6;!K*B=)<=qL!2z3GDQR=Bu-Ce9XKxyzS*CO+>m@31K6k3a|2<;5;8hq4P`Mc+90 zFwR(tZ9A?`$H9zEV4BvSa~`ntwmA>vbZ28qI`3C1cI~lWCC@K}VGIN9jR{W>%IQ3< zRO}IOa}lZFB5zeQ&#di(bZBq1F;)N#ANqJD(dvW+e}4@&!S7wfPnRM?Rxjd?Cy=1z zMcnTM#92Lnw>>HL5-$GE!%m7Zy6pGxl)ZY%N7Z|L`$_Q?A#oA!TP98z^pAt0y#0_U zI{^X!698mS2mB54nfOcl14vGSGOL@)aT0V0H^Lfg2k;}O z#4ds|fPZsJG+*WO=`>0! z>~?2RAa4E2^=HK7-nED)Ug@b<<4LtMCL*iibMbbQ(gp{Sp=ah>*gq&O4RF0l8%iyKu;=;iOc%P)CN&JV{)_ppbK>y!BnK1(208eX9Q?0V{sWRQ-#aH}2!bYn&;LU7 z6LgFD&M!oN0T+ay{{mx!QyKhEG7B?!zw=_pHn|zHY;o72@a2?-qk@z#nx~vcmpMxV z4h+iXUx@>K5~g7EG+p6myu6rBUVYonnnzYVHrp8Y10SoDwZLNm!I%xaL3ytQ9#i+m zI5nKjz@yNiuE3)&#t`6a%t$tF_`oW0m|Gf{iBT%mc_?%qS($PFi+n?s7{H7#Qndec z=i4u0;v+49|5PQ;5qw_c(HBII4&*Ohx%P`HMhp!x^Bjk|<>6w!;(|D;OJXMR_5-%G z!AW&q*9y6hYYAhG4FmWO7sT0~9-xU=W;CNo6`>!@KoqksLX_1n^34}fUSL0T5!KML zO#ahFF;ege;QcQFU-AQwy(G>Q_Ga>fmw*os;1E zCP%f3DseX7Sj9+#>G0(M{=rx1a;*E1vnwbKsULEmD`FZoP&=-Oo5}3|wYW~W zWHulDTFhzfatC~e=X(0*Tyt5McPEoa|A^U8|BHOZkK)&(LY7d^C*EN6z(>pMSC^7* zbTAmTf9pgK8~R}F&*C0=k-v6bERQq(Egh{$sLEk5#{DgU?mrRmLqCZh36pl2=l)Y% zKv35-@+A8w`|h^}eL@JaWgE&PXiaXv9YoiHl9x&-QS^xwi~-4^}8M8Rz_ z#KX!29revUX$xf0N-=ULq ze3FCYFYK$ay0m`m;>52zNWnte8gnO6in9}vPw^Kdsh5y^lJAh>9go+KGS6|7Ua}XIrToYCQXrWg z9+H1AWrZxS{E?P|0^MF$R-unked2}(eSXbwgM_iL0`aMWu_fImzWxO)%jsu1)R|GkIg?WunY z!>e>xjphi(Lz+uJSev`N1UKcI*Ljc^>UZ`QpW`JB?HELq|H6RfUYVvA8*Hgd5sv5c zZtgXI<|XwPg!9wQ^*tpEYR$d;wvTj7NZQ7WdP^?}#=g97A8CYeYA~3m#mMa$DRf zd(9jDq@_Zby_uSYMshlS7EWDTuop>Q=HdjGEeJodPbRySeZReYWPfRZ=hj0{M%tJ_ zx4rz8{!)Z+>|njT_rgm za2Rk3kfE34i-3S`lDr?Vxw|B9^p@o8UXpwc(7U%JZvaI10WBcRSCYR5Tmua7ljN@O z>ko+3OZM_)Jzx8@w5yephlw{l)L5Ix`-Moug{UaLFa*liGs?UzM4BlGWn=h*K~knL zW(>~=mHgW!e0d*3ADSBOl`5deuf>RP&vkw@R2nM$_NDn@D0KlYKj4D~Bi&gK_{PB! zE(jgXKOKx5Up1P`L!^ZR`dm>1DIb*xWkY8v3e$@1fHNL|6}_x->$U2QoxATx@lS?G zvxV!Q^NvF$PvKCdIb^7`K@grgYpxh3y=W&aAI67`kRpX17r1GJv_i=Fp0|#WyoF^| zJRm~yaV!`p$>pOxk_Vb+MMyyoLPIg%J_aFOF6QPjQifCor8XMg;(=qOky6FmWOkMPhR=F#J% zU>3d)rBf4b=Ih3x3-)CQ|8<-+M|d`bCqzjlLS!U&kCrA0;l+43UaBE;^mu8$&EAby zkCz6KTDeV-Vt_P1J3+#(j)pz_RE)Hxr!+#6I|AwfGb1F~X{02l1M)^ma?NN-?j8wk zh%~Q=rCygVjt`8J;)S3%^QJfnCntyYGiSw1zIH-xF+Y%iB*JV+kUpWv-%pedQhX_s zB|N@~f|@%Oof#C=V^dL(Q}*&@)1<|M-(K^bX_AlKQ@&#*8Pbr~0QN>n@`z|jetNtl z=NKgUwTY5k4frqycF^qx{0^8CV~$OdFrQtT$Wv!X!>9^+e+KeO{}#VI14_f*GWSlF z;_-Io9`nkXk|S>XILy~SBSkzlZIUEk0KAbP$yETmM3e@=bAYGffd^Cp?BEsv*bV%F zM6)od|hbwE=WTErKnNI{(^y=_zGJS{FO^+wf~N>@rU==6@G{8WlG^!b5S zlDiRJk``3y1FY9D{@Q;}wo`iMYrPQVcl&tSY^ht9qfgR=sx+$qH&hxAMtI@ZVCU0m9s3?)@Bk^wZzrG0#cex`ro7 z@>D88)Z_$~V#_u*XVXlnhhdV^`5nILImvrs8i-K1nrNH$v07j7q0J@gnp#<-y=ibu zIfTLPU)_1#^U_hFp*??lzSP(AEG~O&8t#%GG!t6f7>FBkJ@~Klr3OKs#p@QJE-RX4 zc21Lik%Z*A{Lzb&UPybEcg=)Zo5F`>qO_zvXI`8sowO4|ocN%nQl9X>&U|_)8V=$5 zVcvSVbeTX&j`ZK4t)3;>1knB2maC;DXBw! z2326JK2yR0H7u0WE>!K|>HN1f(nt1RXzcjgYo&hnJMr=LT4{?=wZ#1V%hIzBSdB1W zSucGc(8t=1k{->~Ve|e1X`7v}Q^$wDBE8&AlZ8;9E+45)%f?4PyqN6>i(wTk-S8pj z@Sk6idbF-u1B6sQl4Y;q9-A?qEcu-u+AL)Vg==}=Ez&oV5fhHZg-5ybt5TP&+M`(S zifpJpdv$OjK5M4nuKE{l;e43ew=_E$*>Kf~m4L+NdKIqqEnGFtTx;R_TMO3)3f|`T zI$ZBGbEP<^StC{8bhnw)Rj2x99&f_6p@pl`%(Wh__glECX+or2+KPTk_oICHR%y70 z9)4Ut{Kv{N+V*$iLF>E@E}!ib;kt7x)Z)#f=HpwXTaF!Mqz6+8fwXyEU!y%-9aZ9m zCBC|!_~}9^QAp0^U3W`?-AgwhXGeLK{tRKa#|l>ckE+y1v8q~f(1x4L>AR(H2SNFs zA9`DQzgN+#D0@5(l@}B^dnwbTJC}!R{kKW7vH`p3W|U1L>sG#QpY(<>`g^nQe(9m) zSpOPA!=>3fxqp!~$F<;1Nj@`z+11gAxLh*q;`@qFXbX4oFN!3+vs`F(z7bX~g}=cc z6iHo$+MQ<4kEEFnLh`#j>yYFwq#fW}521gz`T+m-kkqF`!CR!G+U$K2&DECShM0_g zWPgWuF-x-?ZO&-`_~>kp48kV3ykRpkk><|Jrw~_=5fKN^+46ieVD` z0tk9flIH_T0S)h&*A`1rg0QR7eEEp9fywegm6xJJWU$&p=7nX_`}QqEg-)CBs zIv0vw&6s#<08+IECD9+%P(3QmoImZ-=_w67i{}->mzJYx)P$IKl}qzm3+qeF&X*)y zi-zeC*UM5DXLWL;)rmUHY~*2PWAJ53A-7&%Nqby9paGZ&*JHvi(>LhVbdSt3GY+`nB}Ay=VPsSGjzZUu!I0 zL}JI?Dt~;HuL{AxN2FQ&R{BK zBXmMMHv&<48qnXa1?q<9-IMxsno{&A7r>h4hP%xbUFX&Rl12(Www1#tX6dV8;+Ux4 zje*4;`0R_RdRn#!Do!jn->j3mI|*JDT)roHb<|g&;A1DcCz+KsmDML}aBdHq-g6mji#gqnWjZGC6cMoi(abz8{)@CE{HKmJ( z(_#&3NbPd5+F{ydCf6wW8`9wR-EE{(t1MWg(NxdF*@;`#HQ(3XJ>{^}Ii|+bOL-Z1 z)GjxKe^e*rA14oJNrwYjvn$hT83_yK8fPHweN*j}b}Ew@-n&)y`Z^JR29>`U<@3qS z_+xU?#JyXw9urqXO>pEs zpI&&%w0y%n8{=SJ5## z5U4zl9m=L~OgL+S#$>>9FMdMDx_7;Gn8_)-$+ICP538Tlku}|>v)rs)WM{eH!~$Z} zc*Hz4zWfzB)0gF={QQtOrKqP81sE^qbZZ)Sg?a#n|o$ zU*p8QWOfz>KS_)Ca}cP~IfEZ|Vm;eLBiF2Ie+C^vL3uQv-*#fdg&}|I>-lu6uh+qQ zb6?T(`EF;nP?&RsySp^THD8-IUyUn&5g+4%xQ=zZhjCb_MB_8tx{uh5gpL|6lkSNPebesT*8$CdqU= zr=eAbAI@xtZdi>Xi^Dt#EOcuweYPvMU_Ng~-db|VTT8ek)GgS|nc;}%1`ImWdCSFw z{P8-a3y$N@Ah)J2GKBrZ!6!2~=VpX42zitrmF0!qEfLUFq{S0eaTMhkj-McrG%Nwu z4|!m~)fZm+Fw{p_;sUX8{V(Jh+ZEv$N4GzFMZ!@jPS-q+*~Y>|Q)dzxR0=2POe<(d z8naw7iCBli<1+k~D|@s3#RY2h75d=CpG>3V8Q5myXi$zV;QQJzZ(-{Ke!dNR#(v&E z{@{Ua+0%jndqCSVUoyA1Wf5e4-%_?Ji%9u| zcFZ@6Z1JXGm4^$ySBl?z_uW4Ce!g&@rpde7pG?SbReq(b&8)##=~Q0nirmoKi=8cB zwQzGMHt7Lj4^z$GIR6P8_(z=~n}R{w8c#_lK%xDWL3Ui*p7nEVVu**fXI)ipi9ND) zaCU9M3eRiL5;vci>u!HMRkOKfZm&*h5TfyvRa3MvP!i@(N-}u9Mq~cAJ*$-LQq23i zvgd@py7wYczAc_@zix^)HlvasOOo<&V;SYmWygF z1ATw($dmdWV^r^9teC+!bZ3Kvpg!EM2lLWbR)V_d|A{(s26yhkJcZa^M7=tIbRzWE z^g&q546s%Mq4Pa58f%1T9on!6oGfi)uv|pZkd>(3{D&UwSz&WOKF*7E7UKHxR4+DB zaOuZCLvKC4-Avv|7{KG&P+?E?8aZ|2k16E$Ma30>Vn%x|jvoj$@(d$azkL*8_4 z-gKr6exboq;}C(H_j|IauG#6%a?WYLn%BcI2$*R4LW%T6l?GM}_@3v-7xrXBHkSq^ zi>YqPu&J8OOXm09{NV!E*48>-tsi)3FV@MJS*aFkT~meNg*=OERv{nrpSNI5r2Mxz*S`XYCVtR!{h;k}u={nL*uJh3+lzNRDJ z)tj}Gt1)GeJA-Cw(b#rN)NF3IZV>;oH`^g(UgSIauwEYHx;I#E)HGget=@SwiAp)I z>BFK0kA}_L7AM%}cWdCQd{M#taF8GMMXxNyDiGEr5W3FQ&_Wzs8!_WlcBe9UMYAw#QKc%yi`rB0oPo7)3pHyx`955Y}DAz@C@Z~er%Qf znRX4l#*cNf-}Z-v-}7U>_Nn;r?#mQPol8F!Y#-94VRQ7xu6#~E_P&t&33u<$hInj@ zMMUjlvD1+l#+Z@}Wl1c5u0QKLlhjOEU};uChJYSbp6Se!&BwQYEg-2r%2X?Po|cqE zM`6>xHsc+t7b}zuU$uns&i<^u5P6nA<Rtiz|kREFDaBnOE_HGe!XDi`%a6z-y81iRh`IiHj z`xIiXT#O`1zYhwPHuOw}V=5klg*~ZE*{XU>53mN43tLOhJ6IhSsANsyY!I3OQS2fwg)mlLGF#yOl*6c*qh0%ZLq|L$*Tcm-w5+{zBOrsu;QtmS#@6k$=<-_bD9IuOF9 z>G`QA-PB$Q-q%KLr#ZS=$$DN}ZvMlvd2;q3Va)fN+kfA)Z45PLbkUbSCV_bE7T2)Z z@V!T?o`g@r5}M3UbYpFuPI=h>fqiU_6O~D0G@Ip>PrGy)qZS;Rz*M?LYc|KP9A%$8 zxnc7gEB!i6M42AxW(P(V%ce=X{OGGOzV*1^=5SQQ=B!%J&B7|Z*EbkZAZ9pE#FKra zWF^ngV96hO)qq!S>>F_Dz~ra~em_a*xLID)znv;&^t{l4!Xs@MhN=zF=1FV(dbg&U zGf5Yk^jQ2)nQo!dbwiWY$=YP$p$}aa_nRejM(wfr?3%@029Kk`iAPSkE^h_R)L;aH zG7=J2RGwD)=!AL#J3G(o!#`w81dkyo>Wu{iJ&ic&?ob=16e0w+9f>W%KFXm zCJJ0cm*E%U;6>kKR-a8DnUvd^9EwGxAlHfTQ_Dge2$k*uTDL}bp@loqr8}-Zo8h2( zv=NbizH|`l`ovyqB7)7k2C+FpR%#%V(*P-e-vXFi3-}n{iGU=)V!$%MDnKrv zO%Rj206YL*fDOQH0SLiNW&me^8=xaV59kT-0|Wp<0CV8yF5qXt2SF@LUWgBrPWcF+ z6i@&-1E>UC1XKea0=5En0^S5<0`>z|0M-HO0Vvt>b--%CJODN#$gKb}pbzZ+fTsXq zfZ>2h!1$mnCdc7p3LqKqHi&ls3IPWI#en00Q-E`TD!>)MRlpAb1#k;+2XG&tK^P)H z2WSU-cfcTk4xNq9+faORDxd3yF_}N zj$B5SJ!e)P|@>0siV_G z9x-@ejkexCL>1YDr-3}8$b_1QGyg${n!8#3pegpm2vDQ!XzqsYKk86&!@yCatoV)_ zhOw?xCSMqa{;hE^-#Co<3r^qh6T{FULoxbk7)usj{s$jD93$iz|FBqapwh;jX)xTg zhO-o*?kfLjIGTaau5y*z;^Y0L3`amW> z16Tpj0!)LTC=L#G4g&7iSAW_99dJhh7vR1QW}|?alkHUf47J^`EtD4|UL8s;B> zPQ)mMY1c~NX(QP&7d7v2>?8F?ti|1MiHD71zEf5sL)FGb*5p{^3`cz9{Od_sbJxK~ z)gad#C-p=57Mc5IPvEi#)4v8yBHmC`5Bs@iKMn=;q8{NdyTnh7V(pxRzl8>2`Xlgc zxw!r;|7jE&NMwDd(X3+!VkkcKMoeBj-ScGm+Nxo4)!qgmU(qk%5-j*+0ry~GDcviNYSWl=)VQHN2Wwt1RpwU8)Ox5kWZQQP>nU_P z$|sFsU0ZFdwpef`j?%wk3>(mqie`p{^71K~I*8HYzLP@jtEu8=$FOi=+a=z5EL0P1 z#|vXICtJmf#Qds0&pYl37@f+r+VKeSreglbgV`6z&H#f`X1#!jbpwY z)H(+{OHST?`b&I#H0#?1^D>Q7mDiCuF-nzdv&`Y!qgk%7_Y&_ho}~-> zFY)c;*+~JN#_1DSFxj_EU?JpweggBzqN!(SXbR+G%y+Xx8D*H2W@|1s%}e957-!k{ z#MQGX$*ktwch_nh*g2Y;SLsR{>At&9I$U$MrVH>m@!g0=;Pc>;_P2po^G^)S{V8JN zyFVz4YLaMD+_Q!EbU0-GjdxyTU>+Ts{OW6xh;@CVUw+L1$xgfc1esS&k`83JXTi!L z503deGM}0x8Du!aV}@;_o(@3!RYUUjF^d(}jQ zuJPofJa{6T$WHxYB{LUHWOy7~Tg6M`pv_->&HspFZ^R)~WV(#oXC_)F=VOfe&#|_p zE^@>wZ#gzoJ0{ot4oz)2iLXEsvC8u1bo}NdOwJ*uKJlz)dmW-c>)gIYjkE0>e>R@^ zvrPC_6Y)koGiL2YBJxJ*!HjDoGZ7%DTaSKw=na?En^Bf?zO>wR@JA`N%kax_Qa=v+ z!J4lu47yS9=x13zCEipztE= zNqqKbnLNFkykk-`F<`3=dphg6qfbsu<=pgYoNHHJ!)qvkmIRuB3oFNgf6R=p@W@-? znYTiJW|WtmtrL=vfPS}KLV^(-G5G8-Da{V)D=ZhFu$&%uSr^i;L? zWBGb_5Y?%{$yBFxUR}laPiEbEZ%$?& zVFe(-FeazLlF`Mu8q%TK*5ZDhX0Gf1WwpjAgRlgK#OlDjlN#M0D1ucyd(`UT4jEBI!m(`_EvGvne1gDxP-qo6J0OZrDrgPPb}fV&#?KzOTd%4tAxAH zf>~6;*UVzOgp(!QI|b(D5`H>`J?~nDgi~5$OkbE9Ebf(6e8g-ti~j`qY>+j8e9qsJ z?U@6zR>$~Hb3o>KjIVhXWYsN0yIjTXjVznezQ)M1$Q0+Y-EE6NmP=E}=*Xd;X>s3Q z#gELT-pWN@KbP(Ad;kOxvV9@vV1aEJ;$z) z*D3SZKr&yQ$A$_1$9VNT_KXml#lxOwo=!nof6yx($mHVvv-#}jS#OY<3!Z0!olsH5 zx6H?^Ug%f+$N6j(h576PbSi+~xB&fAnC~uN%Y?g^xKA334EU7To9E?*+s%DPxrLs7 z5hLmf;P9a9+OJW{CYqAm?EkUy0Vu>vV<8HO*_VzKTU zP_0;ORmIbbSsqavUS!iAQ|oQiB`;#u53bK;vSMM}G48#D9T%QMUM^uD3E9W^wxz7w zFsdjprWkoMZ{$PN4^*zsn4<643ORcBrk|#lp#w$^(JT+O%~cW$mZ-PDEFQdw-(Sl5 zM{GNWE{J+zjBTlKwL=(6YKFI?Y8pde!9YWu4^*B)RvU|`TKyJPCi2Rp^C}KW=Fh*x zI%gTkTRTSwGL4b=!?+4D?Fq+c&S3i2q<5etD2uxh`0xF^zVAz9-~EAr!09|7^R!;y zYSkwDs>3!E^Q%q;_$T+q$t#?ltpPjLPAPP@9!qsDI25SEu}JQ?jI~3zP7k9e1tp@& z!{z`w#FYrUEd*qW*5pXda9kCiwv2To9&K)@^>ATM6cDP{N)SapcE#a!OdCI84=20H zf{7>#o-SUBR%9{_J*Qi|HPC_SW!Rfwai4a9f3u7Y&Z7G82C~3}m5)7fNV-x2f$pX+ zv^oFEk48qW2F+P(h&hAFMU&CmI5qfu-R|WjQ@H$}I3}{AdLv77dA&YrV4Qdl*R% zm*ZGP8xs>)I&h>e!+D@XB1E<#%;H35&T^fd$>{(>_c1x53CnXjh0tBrTt@UMCMTMA zH!acPdKY9;9$u_ITA9LQvRL~Lu;akqM9US*N7_@TqyEJ1iWI&w3sZ~@XvmE>@mKBu z)b1?SAzC3+5&o2(SjC^57hHju0xgpVF4tw?8drGPa_%1P|67EHCi&{ zcr}v1c_gDY@ z)PEoK-%I_cJ2x!ev@6x(U7-H2SO0U>|JCY$w)($J{m)eY)7Aep^}hlCsO0$jIV^xS zsaU+P;$JNuD{uNBFZUQ{LO@O_^zWWb|DC7Ne{drG501nCob~S6s^OHb8l4TQ;Si-7 z-jS-&Hv-1ajSiVGaO3fwd8(=1lLj+?B-^uWrfZgLT2qT9xN?VLlnR_;*X$3i1_RALqA@yZM`%hhDuyHKZW`;KEwgx6t1`K){#WAPxP3YL-j-mfhq{n} z8&ly$m&A+D)FbhD{R+Zt`nu*o=0oXMtb> zWQ>hbmiXf0E3$mN_zGXPmUU`Ph*Cn7s)&*fMW{Zlk?*Fs4eE0%YK$>2vqIW=Ve$S{ z{V!7g_v2s9Myg#h+T;x0kF;wt9Mux+kJOT zG7y?F9tLKh1cs2OdW(CI&7_tyus(leJ?M;8JU^FpZ%1jqcO@^F0!f-N^=w(H&RBJm zpU!2UJWa)bHqKeR_o^Hgs{cFH|84637W}Js__7%E^B8SN>)MU?-^jY+`QI<|Fh@8^ z&;Q87fV#V$d#+<+rj%o`)7D1AhgR7Kdri2OT2|H0$!@(&Shc_Sg!{9P-O;{3j`sU5 zYJ3hET^cN9{AwOn1>C!EM-zHq*Yte33B9xdUHCB*>npVB#&4R?l^+h4)}wAXsOMwW zvtEMVa=vgqOJnyJVp#^esrc^gtSfiSXSz1~fNI8d-OCGkuYA_mGm=Ovl$GZ#76bKa z!yylJ!_k&UUEpc?%sW(4DeC+|fiSJx%aw~*#u+P z`Pe+LU=IH^pS8;xJ*Nc=iUfOe!QGqPLU46tZ^p7xPVUVFZEi`g@F(0~ZsrcgZJa+d zo3G!%x^?f5=|Aw!42n1C)a@=Uvg5N9{_6&4K??sc55_D$V~c8JS&a!B*#KeLT)t`} z8!y~6@{1eU7-5)^cP>D_tbCS77ofX-WfnIUU}pHlGgkZybFAix+1zOp@==)2!!{vb zPd?9=ZGu1HV}4*0@;$hSpM{xP{lPtKu)0)CmrA_}MMk)#r+gd=(k2OX0DvvLqpDmQ^82o*{)8 zYiG;%n3-06cze24A2v<1>cOyNtGQ_gAIw>wQ5n!g%5AK8tR<<^Pw{^S9BVKDT3bQZ zZe+!t%MF#VVcx@)>;?w+tyScXIN#@(yr|#J&vWS5fH(Og&eB{L=s*{TDFf2^SOxR# zE4H!zuKio0O9%7g+n|ZbgZZs(D7zmG;ZED3q1}e?=sDXc{%)$!0K zdkZC45Xyhu&boIGh5LWfsMeu8a0m0#FK?xC*%dWS7jW7+mR1&Us{_rKD9NoFc-9Wq zja5!i=cmee;zneKUy@bmJE!yRudz_UlE`Pgh8c(pHYvMK6p%FS0+TSIVDoH#c*Ctcb59kRo<>VMwT2{Y(Pc9g zJb!;Dwi$dDZ%snX6sz4b$=W1MvZ7~BwxWkl;$2BQR;jGcVXO`V5&G#hxIx2ZzfM7k8L=ntv@uGv*rqy15lCj?F z5sX-1X~NK&1D;BM5E@DGlwZC_b5M`^1=nXdLJfb4u&Qp&YA@XIg>@pVC%74CgEz$h zti~=2D-$_4-LM&4#@>h!;BZ%%238$D(f6WHhEEz%(2j9@GWzuNidFVurJt^g_cDED zI-_jgbkCCi`T@j~f1Li6$XD-KYShA73!V=9Ib*tK~UE00uTuJ$Sc(tw#%N-7NU2!jSk%3dpxs*pd#HdtuBapfs; zYSeG&uDtRlVK6n=OyVxhMXqQY_?1HDmF1~?rfn4Ja)jMns2L-ggj$c_{wh=wHDszI z$w8+65SjL|^eE?4=^Yzum7b?6y`croq=!t=D7QBM590f8(p!MF*8eKKu~s5gdbu%> z-jKhD&syZD`|@`}Y%arG`v$&tmny><_Kh;^j2N2B(0zE54DbA{4Am90oSQN!B4il! zSOZBJRSmQ%qbgZa##csK#i>`td3i%tGkKCYb6)xXL7dvF|ARQc$3kn)sUccbo}IDx zriC^tzU><PC0v_ja=`eHzAMkVKoE5SDG%U_5D9x{EY%?P={4=G?^PgerN&1zz+f>)E=U zM-v^t_9nx%&Rh4eF5SC;oB!fHd=GPL9f{tWjgHUQ!`$1aVR5}Nn~86R-m5Z8&rN%n zXTsoSj#N3FMweS{S20gHkr;ctPZa4pudM0RU|C&Csdd?c`8i6;>Tjpws=K?mB;dT# z6Fu^HWor$$JBaRd=e^7&tG+X#l55mFvURJF==jtK<#iw%IitwE|4Za=dH%=9*Qzny z#cDDNSL2<>-1#7D!;kG{eeJtDH}GHfGN0g`n6$A~L6C>mA)-T*y;;9Je`5hAG?n{k z_E(libl_v(Vu9`6_!Iq1q@GUtt~{Xp4x?RYII`m{*2$q)Yv8|WXf|}ZMU9vLJDUA za|Fp>+&`acP0r&)Si5JGUY(LZmCxLV)_p2pNyZeudmro8ZAuF-e+jbnbpGQ$<^yWo zewNyAaue5-2X(z*w?#%efoqRd1vel&}x>xo2N2yR8?t@DC_qVX4{5sY(^N&L7W8PzJ`Q~@o%;{>h-(GAM z?Womiv~gZOh(yLi&z~!S$VV7aiGPV_AVU0WJZ+oBqi_Eb+NS2UFbbzBds;i5`yTUg zuf$3+X38H6TS-MP7h>+u@4UzGw6v%e?;d>Y0oHmzGEVk9E_Yf7*1pN!tc+vq{ec6O zZ`Pi#J-|Y;?maHvN&s9i`GchdNEWN~_}3{;5LcsWtNQVT`!7h)e{%ogZ`^I;?e0=T zmbF0I5N%XiL}0TERy(O@d%GvvCh*!=Hpu-RdP+9?Uljj6O+$+U3VIx_FfhvxmHfc_ z%)_k+vQi#=spd51mRlK=_-tPNKI<0s38KaH|0%dNR@^Sg?h=HUC!QIl)u?U9=Xsw@ zgZPzTFhN;PdC{m^pDQlF<{yQ?M}EM13?f35tzOwHaCMzWf@uiO*~rM2lDF?!5|o>m zN`aQoh*y5Fej&0~5ZOfK;(7C%A7I=lgfHi}KEybza5?W%gcY^(OL31aW_mt)iGNYV zraa@Y{hl?okRy&F)%~>Xo>ek7`{_ozDklu0w2kBUR!RrBHD#ua-u?BK{@wTSypOQ- zJ>fV0;YS!+h;Q+Vk8u3t$S$t^n2mS(dEY%G!M2>lH*R2EVzO>S%dn10YGrbaMgJf3 zLg)6}v(BwFY89havRNMkK4^rXjWM-So(C~~yBxxlAEuwqf6Tn>&+Wa(=N7PDohbz5 z((ZGOIf&y%sKW5ngAzQO5B!9A$_tv@TH|5mcT)K5Pgu94#r3NC(;_e4d^0)6;(h0P zRD=13jM6sGo&4RDJIBs8=FTV9FEqL+FlX?G=x(Hy9iJUk(Hw&Do^EnWEWBGGdM!d!i2XSDtvXJ6`SkV~&Z`Ln$Er(Y4 z)D8wy`nCx3+2&#XP4C88S+j#u3&FPR-Sm4>Iom|5@h@+Re^CYXczXC1S}{m7CE}ZB znkAyy&5I=1@r7zi+I;;6r9^59=}|d<5g|F8JP6g}zrM}f1)qbs%ot1Ey-#w7Lo6-J zOzDW$p*w~Q-Ej;S7lX3!O=!d<9o`Ovt8JyXveKAKz3eXKjf&73DhFM22aS4XB+1E2 zbN@^u4T`&WbH<;Pl&{(m+r}Nl@cDV}E`gMiny!J58cI<^rqigHxA=~1Rui=mhNm{Gb;sUZ8 zAKMkOCqA}ERl^?HWH&|Mtn)#gR$NGUfBx$c)~+?#E6FaG^R#2kEvxz)%37ta_AR(* zYT%+ES*Gavy5p+L&AKyifj#F$NZrv)5QPy@8Hn3fY83yssc#6_r_c?nTfi68%NwEzVEW6%%GPVM>9aFt^s& z67E;`;9s`SsJa58D@iMYjH(D$6ql+xwG`7l*#)6Cy>xjigL~+PQk)NM} zrL?*=Uqe6htFUFI?mj+?uM^EHpdn?;ByEoP4w&py7XHF9);6l*4p3=?N>+*L>ka_} z?pL1Bq8YAZ#Q0uv4=4AL=vn%fVu`#={nV?U#nt4lKgH`ySo^G3_xxcg)_xDnqq61_ zQAH9m)&jwjV=Wv>NIij3qoW>Zoe!~-LhhwDcd>;#Blm6OUTAaw=NN=|iZC10=&~N? zL4LjwBC&Yi!May|KCbn^w<^JWT>D}BF4ok-Yn(N(oD;0>o*OzSRG56M#Kl2G5crtj z%98{}B52b{FqPFEe3D`(QQSUBYFt$JEIPEsRfPE-n8)1WtJvon&=pN+%Cr4w8;f%Z zUv!dJm7<{|#HWNPXd-M3rP$*K;4_=>rs(3j{Q;DqPwNcu2m8tsH0M`0JRPAdBkHlB zHjS*vskL)it%Fm}?2124(b_sg8XAP+{Y27BC8@HKgsL=EDotON<}%S}o6|HSX{C~A zegw(26MW-mNB~ngx^CknbtyOrBKMC^kSbiQQw9*nS8eXCR>Iv#?ysos)pZrBd$rB| z=WI$BY&2)N4f zQJhVBA4xOZ(hcU=j5mKA?W$hG|YGS*&q zbvc!pTEfh-Vh*bqT^%stR?Jov6GE8IDkf`@ib)~N{bQ;=)FlH|TtFDbh8a(o62e?j zF|~DJgi#1{%0|#HHo{j_#xqp zO*l2fqYtYJW4HmQ=q4xClj`2r>b{KJ`?hp1zD!6DAa~Q=LCQ%o(e!DsSE5eCyPjt5 zowxmr@{D5#`NJQY#x?|2D0j`sy{kB7UiW1Qk2%fUqTa_&X0$-fiOPtG-2&0hlICeZ z;j*@tR_Z&ZvGoY@RiX|e>iPVm)2yv$@o!H=I)^BdiDD?PJ&pBuwdJj79@bvd*g}Nm zN0eKL(!m;Ye)NIHDyIegr>3z*pnpgTTS4?+p_o8$)VV80FU`uK&NTKqsICx|&#$2R zP^ID-XHZ(({$%Ydv><(*NOOsFu{FTI=_^=0959XDkFe*FhZ6EI(#C-*Nn6b0$f;lu7q29@b!N`O=dJ!->$stIC<1ua7U)+n5J)VhpwBh(dYvJzk-ZAj*i(q}10vl*q%WgXSjz}n)(~{kt+6(k#@+$lTB0i@ zx*3ghjinIXtU8aTaFInfK_5@_`rkm`AN2fEIdknC@?K-0joCv)QAA`Z<`=>a0;JohXX$o*3IJ7=-P?U}+W&SI6+ zCx!of7HhEj6yE9_%#ak`=N#PqQ}`IN2jQ{{m>s>a2SeR1a+sD(lz--7d?(XR;i-K0 zIV>|TJ%Zg_wk^h~T4g8V4LpnKp3oENtXxBF7^ag-_t1yYAO7;3=+2Zp^KoQ^}pi3)P&BuU<)~=fG0E>05 znnHvT4|u3`)w~Uu1Ly--YVWGKFJu8JxN716@7lR)QUE>xMdPa321o?B0WMo)&BuUr zKmfoE(D0|M`2a8l;0!np$)y9{MWh!2w*YONTr~^9IQ_afyJ|9BkTAd;z%)Q?7XHQp zh64rx0suaMD2TQlKmaH*0tA!-iU4l{wg7SgnSfM4B49jV6d(xD6W|G`M_5+?#efe0 zdjUHDuK;oZSzYkg4$umq0sICo6+kWE3ZN2j5^w}i1b7>;6YvUPEg&0yR=`XLqymxw zae%RaAV3>{00@I5rU5bmTL7N|t~eq8f5Qj;Zr+nM_W^o#s5-~&J@;3D8V0R1wNf;oW3pNu_h=(oxRfFeK@Kt2f^zyL@C z6ab0C6=U%z5(`%$k`# zcLDBq^0_4Ar;*QNL+#azI4O+paKQRz-(mFqa_~h4a0Ijhv@;Jj^+|9QB6sF81h%|?j$QkL}&xOCwoja&#Q0z`nW3T8H- z0FeBVIUvpXPrKoFz@o<28o+*h>-%VA!xfFZtfp{q*kxJ9`*U*P?-XTrc<*T&2Y*pn zIrz?_xFNZ4s|wY~rGJkiJFfbDyalF35!=1UU^rX)d*y zKKP!Op0Pj^A;<7T?;dB>`2YQ{In|WZnvSF6bf8dKhrP~g?LDOvl2LsU z!gMZDQ;iP99z-DwVuvsig)ot(5~f5+7>YtN5<(dCVG!=;wfCOd&FA~Q@9+J1{2q_r zKlkqO>e|wUdXYflqU+qs#%3v2|7z&MZ(+Ji%R&E!2`BbWzl1a zJK8ZA7zGrN4Gy(!CRc*xpcKpjlR!Sm20Kn_CNBkZKmiDWCg5N$s}<$HRbW1t2l7EC zIM9aG0BgWvPz*)_AJn#HCBS@80DRC59BIYm!5q*J z1M@0YoziSxPE>K5iHNiK%dnz4kGx@{7n5rhjxoCH3-C>a{N(viBE{|Yh*Xy7h*Fcim*UQWG+DrBFwf6BV zaHw8>FZrVr6oOGzY61Bz_44cL<;%&ZF7fhu^-JpI7uCy`q~zm**_4z5t}hL*m-p-C zd)CY6)yvEE@<*(cJ7)Yt$MOlmaPP4KaeZk=z5K>{`BnAuOY7wq)yvPTm!EVrpSZqM zaI_$PeaWtu?^ZA0vR*#3UjC4I{2lM9m)}yCPhMYIRacO>zO=Yretx}t5&6_zQCKfO zyk7f$_3A^(e6((#ccUPcsM^=dHz9wNYMEqaz4{vC`1-x|@;mC~D--$X(S5z9UW2lF z`O;@lT)5|E@8mb@O(b>4#GRComLt|%8+XSZ;VN$-7@5Y-pBWs&!7zOhO1OUT{YhspY5BxK#j%#dWM`$16g5-jCuo@ zEE#A_eIa$S#q#mJfRsck@wfrdgzu%I%x8>#hy|b!lz=i&395nUlP<;n=-ce>sMM6P z2h;xC3^{*Fay-5lgefOqIVnTl(gcyBKOzU|HqtWEN>V|PRistqcaVy4#YaAYMH;{u z1G(AD!Fi0!b!tcj%J^Q{j=eZ$i71Sghe(`~vcz8WeU&++<58TH81G80};aICcls z=T$80*X;eYX!*^Iupl`b(i-x0R9iamSZ8tD^@&!xgtD>VJyBX1PD#~7FJvMUrS6JOG z$u-){Ae$)P4GHXF?LaxG21V4BzDBx>`VZ;%I%9w;AiqI5CfN0)?Oe_@F0f51N1@P|G230PF=-U?W%wmV>2WF(?I#tkYz9 zAz$W$5-<=)Z)5x*3)-ZXrl*BfcL! zwoBR^Us>H6PS-j%AtFDJ-o9^a$RN2(Bk@edLS)6#&XL=t%TDauX~m|VMcUqpxufNdvAldaGhON%yOfMLzNEu_Vt4eR z!NESUCq#p)J~Zgz#J1P9miMv@;v^J@RZXW%_C-sXR!7UK@)BiRQp!rYC(1Ualu6w( zz@$zHj zQr(sZ%84N$KZH^{GcGpPkcuTKbB^^9e5eRPPzZxnAg>=|58@jA$q&qw4`Vzk$A~0uriSn0 z8g-vE<}U=oL-F!sHjdt#ptk~?KB zjhC*cG=1@)*aHJ0nE8WZuaM@dNNOKNCM54J+ z3B+edym=#uQAAPtv4u;o9T@vVbUipQ*6|#=?j4wH6YnTV8xvQm8W@{Eb^4Zp{J}ud zbpvD1igeY$*!vBf}+72cy85j$T^neu`BhtNA>}HV`4~#t}(n$kj?}&8N zz}U|sJ#L2%XAX5cv~W^l=cVr2f{ArIPq_+$1j)%tVyEpmFF}-p7)9*3D)M#pA{9GL z5NAI1sccWkWn!llG2UQSPod2!AkSncPlpykbrIJCRZHWv*(R>7l+8Xi0oqH2(_`)s zc|x>$8$|mi*v`P$B--SYiXBr~kenQ;U=!O&g_OFNRE!}$VxnS$NGBeXnnbp4qGgQb z^E~S&TJR9N^)V)QKNG$`v%6fwER!>hPqdT?RbPEfbS&BlI=+l_@4#4JkqW{UsUTdD3c?ksAY73O!WF3?+(J@8xFQvVD^fwYA{B%y zQbD*P6@)8Nwp{Dcq=^HGzq}Pci{d+(bEspiY&7Rj;xMYC@-FH8C5|6Nr&X85nvWq} zdRfdQ%@IV-Z`s6;rn1j@P_gq1K>l8D( z*w;PDFQMEf9Y~B zPyKP*=MVO7b{4EPD{-OP%-9R#6A_

;h{gMPpUJ%OkbcQBmvP|6*M@)E9B29!owf&oM%1$I?NMbUyRIqw!G z)1C%E?wFYA(PQ-9tm7C!{?$x$ZpA4RJ0^(EAoy_Bdg-JB&Cy~%g}FvvggKdeN5K4O@fWcw=G%i9y} z^GFqt&$Y6tuL2UTD$yrISr3p0a+8or$4;Jl)zm9z#7@6LKB7g~1mdjlzte~I!;%JE?S z(*V1N951i?ULutw%k%gqrHOL!jbCQZOnm28{?hQkQLgsZdh22qeC|^kR(w52{yrQl z{!W%Fj#S9Inw+v_Ju1~3vMhc8ZzWg)7J)fn5-0#KyixJ%7P)U)<9=0g+-p{FYOL=Y z^81&LBrhC_McMdAk2I94!4%5!yB%{n);S;lt8^W0rS8YK&3q44i@&eHHD+v;PdRNk z`Md%6T@`$>pbE$;zi$pIK{d$hN0}1ayj8xa`EuHqo=^T9{J5a%?26voo@Gv4$(`0zUS8=8+JYMMBiuoyqyti z^_D#D)chQ|2$!qq4#CIis)T$gSOuz+b)o#&vpeM0jYQkw^pRq#cgQV=Cu{3^?;$UG ziF~nW#YaSv|HDUoKNlRS*QW`t+Ll1n$NR)OzbCgGnbJzsh-+?3mX#)zzNM6nO!gFW zXJ<>3$d`bnU=L`5ld}g9V~F;dV%{wph;ADbw{+?{zKiO*+uue$wY#X>C2l6(wd3Jr z^SUmXj4rMu^2PbFj&IAYCyRR&GZtlHwsrTPPrmLhM4kAg-bJEBlIHcvk*6eQEy~0V z&m+GOh&vKxqD@+SN^WXXQMH_^bt&Biv)D#{4@ezid7t=0byM4l{(I=3Er>Yz5&d(? z_W-H=_ayp{PHii?h}BA6CQ-JLvbvQPdGWFNVeOKX>xkPdCBGEZ-KJ=hxJ@Uuspvk6 zsvY&Z?3|LEZ-9f!57n-k`)P)wLDv#b-JFCnfuf zyjZ0<9K}uIK^+NJRpb1eCBSn-%yj|kfQ`?I2YWkPe>t9a3vR?n{v*P`o z)V893CH-qs`o}jk*G#>(Xp?;KsZB+9iSRlQ&Oab?R)u0maM+&1- zgS89-Y%mhc0S|(8U=OGTjVrRHeqcPf8LR;7K@~U%vez+TFa%5oi$MkW3N%=sErr0v zU@lk!)&c$mrqp^vG+PR9$d)Dm;!h?1jGV+Dhm&3h{0%ILKVKzDFJ(*ZKre71;1|6m zei2*ZSFNS(;0MrrW42^~k>DEeFenF`!7lI>s0EE*&X(E(1)Kw}n81G}fFIeF)`9Q9 zNv~u}gTM{od9VlMyvj0yLa-3L0UA`YYG4Lf0=5BZQ?}Ftj06k8I#9DIJN91CtaS?x zqMGNk$?R(~M3XndG5abC$U#NPQpZk?O^LZZDe9^~#$ z*g!H#W0ia4_8HHNl45s$CwI;rMUfa*(CUe<*j&U6ayiOR~|fx<<{P zxr}fzy4QUky)5?ZNAhWnd+te?H;eYfn(mgn^lYEZi%SX4CGMmNWn$Ka$=QmsC6tM~ zE7~n*%OxolTap#Zez{Q_%4sXDOxBA*Yf?JqZAdoQoJ_YT8;UD;`zYlKpCv2Ar3;f4 zVqr7hzb?5(izuyIqosToEmx7ocz3jAy1XX#z#h46=7E&H9e=o4iZ>HY#neQa_i^H0 zl|+Xo{m6@Qg*5(DItI7>XRnfEuYzQ+<;h;9qF3Poxm9fLZux}FYO==`ZOt)SY4S;; zLM&Q$%DJGll2lyzg=G3tvb~@cJK3Jl_D0Q;<)ZDpWVv`MdHboLO!_uCz`v6X#p13^ zZP@t5M8oE!Vw4V~Vkt$#11Sx2&qy}3k`2V7dfgXY^6ZjLN7LH_Q7gjoKvZ|4gahm8=&t?pV0=KM5s! zUy=c=jniY3p5(>sa!F(PKg+F}tvyB+lPEm8w0)@%_jq=)fmnmZsSUU z8px%|3UR$7sTJiZ6+J#nx#ngn#5K343^_ct!Tw}}Z&Mm9OlcseR~);YjmZiYu~8?= z#mGHL#eD2!J3(>>QwGQ#l5BWkvVpkmZoK1pbX}$;8(f{zU}S28(qw}NQyMHvZLm7o zfRT?9ZDq1SoX0HNk|dbJl-3bU=I4ng*OD~B7{1@}pU-vS0tWyQL@)4(MvFf zX6ueE&?*YWeTj=U-}LqI4Ex2e6AZhSMq&~C{c(ovA57*&nOHrsntLb{S5+9CtYjzC z{N%+%yK%f*TDOSu$dp->rB+;%Qn4eo;^CBv+GK^`Mr|k;m)w)Ak3X+35|@hanq+-# zO8v-0{e5)rv_8>2msH%zDWr8fc~Np0`HN%i&Pui$n$m7t-Q@&xOqPqWG7qHOacN40 zl3G!oQZXu7A#SX0W_zd?qkWNVC)RRd$^dz_R8S^Kyl^8LotIl!`5hiu(?6 zn6{sncv?LVCZ<%H(vFu!;#;Y(024^fYjUP-Q*!7~LXD|K6%{ux<|EQ3pbMjke0jaP0<4}asaCEAnPA(B#&$vdq__xzZY3MIATrj&|NsTC_z zDi)?zY)GkClUlJOrJ_2e;>3L^6-{ED_sH#HWxM6f6ZxToqfgpSDNpCGWQa{9C}3Pl zdCQdYQc>Q$`OV{xr#NLoY{R$mX^r-Nn;^Kn*ykU~E$+jf*>eX);*p3?9q-&onRqn$ zDI*V}u~;`~v{AE^a$yt|+;1{C+hP_hhH5Va!797;PY$wdy?11EP(#2Z+0^o2R%_krza{>#9Uu*;%n4XrEqrR;=;& za@%P3_XP5QI)W|{R%Sl=l!;UrEJRv2Ru8_Hbd=(r+rs~*@4RGRVIoNFE9OzuO^S1d zrHN~v9B;rSnw#t=7|8r&eO$9i)<2n2zb;uX7-iZkvF$&}9nUfk(>Erf(!(a9io{a zgO-%VMF6}HiO;Js_ec4(+;J(52lHJtE*6c2eAwpI#KauZI>K5-WpZ0Li5>b-&W9?3om$l-t7=oKmc*-0 zR4R`x>yAY0LW;!gOiosbtJfx4m!`Dt8N2>7xzmZ2DMcgWMXhR*1JtGrFh9{cZ_}~M zt&10>7it>qs1>DUS%;Ja9~CO;={RxU~D*pJfWYVn#@N<~q!LXc4#%EetAOxBCL zSemRCyFGgN-|>3UM%vEHYxCdFmRge5eQxHRvE@6l68v(k>{(u5<1a2q3x7RUmdVSD z{Do7gD5c%y;&o8k9Zo50z#Dt~pn|mLaJ;YBCpZS>9Em@;aaZS7|L>L3|MyDi|9hqM z|G!sC#e1dym#>t@KKoUEF1GSFxgeHVE02jTmnKdbJZ<#2v&M~|T0FUUF7{nY&K+Gm zWAdDHr;QsgNe#*OnNl=q^nk0Tj+F+G>o zlgH04nl__Ys(86p?sQU=Kj0gGeRXmBoVe;Kex+StC9kTNwdRHHwmDMIaXFF=@-Teo zuf{hGiU2=ZAXTlv0RANTl^Cs`%a*D^WqG#5&q_*#p!!)XxT1`-9OTib^eM(!g_-wh z4BRzjYRD9U@@E(fbbMYq_ zhY1#u761tpf;^B9svnP1K;ud>rF1Cby9}zxmyj#yP)&Ks-L$_iTZ$_DCoiD^ zY0>>$fV7axd>}8T19^$>3g7d9%=ePJs0WoIrK}JXfD%vys_$Xqpj@Qn%Rm*#qiAgIE>0T;85hwuFpc2&3IG+LXM29<>1Zm!Fq@Wa3-N6NKr5z|IUj}Lx(U-JZ z)PqXu%78?94f!(qD7SMhz8CRbUKC|eD)T9jxJV%=Ag_>?k`{qNI#iLC1OD)glt;&! zTjE22cgQ1b=`w zU2>#e;9M{cTmu$^3h*BIH#o6tj&ueX0;YiZpbV@B?}0;6{>$jbMS%&1fGfc*U>SG~ z8~}fUPA9X(;CwI%%mWXC4PYnu9Q+6xo{}SV1{xR$E(KSCMc^?|0k(oYAo?Z$9R`iM z^V=671p0vsz?I+za1U4kHh{Omm*7v3+k?jd`hyF=WH1Zd2ui^t;2E$P>;zwezd(yq zp(}9KsXYHn_%a>b02YHMzzd)fd<=d8X{Y5#IiL$rK|UA(CV^|f?ch=HBG?M{f*(Qp z>HJOy=mAX74-5rkzzlHx={)}!U!DXnfp@?cpcXXlnIm-o3g`!hfc+yL$d zkAXGdb?^cB9{din&VY`93HpKpFacZz7J&P~Q{ZJ#1*$>UL;UwUXsGZ!!Rf#S=Yk8t zXeB4s>*8jcDpt15vC}e+NPks))-K1&jGdO3^UP^O$ImRDHe>w2!NZD27muGQ&73e4 z*<<{Sv#uOHar|Y&M$bB0Rk1BEXJgum`@7_%o&MkTx?u9uanoiW*DZE_x11IgOS|Tb zYf@3LBRegvar<4_assi&N=}!f`Q>lLMkqNQ(@D)_I*T;5{^4Z#D@sml(e6X?`C_d6 znN5>p){UJlXI|A*t|@LRSAkVvDG)l_V$x%C$d+TH)SULQ0yU>c15wPd`_!D1Vh^f0 zCyHytGq0&Rtx{@FYbaXwkegL_TF#eQXHR;Wn8S_eyePdLK{GCMa1&vhl!;4r1fooQ za%n5l7C=P8rcQ;+Jz(c_5tn_%PAtVfJEwK?x;FFPBs>&Q-@wT^rEW%=lhdW{`$bMp z+tzjMQ&alf>g4o}u6c{sr@$_702~IHJBU&P-9QNR1H-{`>cm`oNBWEyKWFUtBJoQo z`7?{h<>yPObmaMJwK;=^hW1yXS=h| zz1dsh_3}Oc)bPmglyIxalaY0i?U7xPuOdf?sl`gfb<>rG%1KJGGFQ1-(Ns(Ar)Fp^ zw3*tC+EZHdkQTZkG(U7t=p^HG<7{KNF~OK;++Zv)?l&?V+3}sR&P?Y__k8y*_Y3zI zx4ZX?C;2Bw{USdtcrth?*c0pz4hN0Ha=2Bvdzh;B`8^`7vydWXC}yiWcXenxOl za7}n^WJ`pZ6yO9W>8ga4fy%kcFlD52sWM)8cJ_C#$ciJ6Zf2wR^M|wAVtf8Gjp{OvOCQ zoN8WY-fAwhPO$shgY6bhzB9lX>|Em9;NIEAMs!FuaDG-J1@dA9>4R~ly&M3^%He~R>;L~(PMg< z{)E0xe@FjBuhzfQ59@Pz{@)ls7=IeMEVyHLbzXAkdiQx{-t*oz?;UTa_oX)=d}^eB zzMZW^<-6&E9DrvD2Mw=Okx>bA>bAxxu-|ecny?div-1ll)KpBmT?bIg!UA`yvM- zQaLvU>&#FlE7O#Fluwk;l??S{^>nqNCP%fCv@THhCE69*Ty3$oT6C~lto@-$ zdIP<+ewwc7=j&JMx9Ruj59`bIr}T2YQs1TT)zd;9LT84~35^Ji3XKU(3e5>E;=Wdg z-VXiA$~84w8f}d{LoxapgN;h#P2+vz6XOdW&X2}nqp5ka*~@gz=sg%`eQu=AUM|b%NE~8e|QzMp?Vq?8 z+j+ow)_KqQ!TH;1?RIs;?m6yEx5RzSEq8aj2iz09TyFwAZJhsDkR5(a5Og)+1SGGi zdD_4A7NHSlL+<|~cfY$E&bP|n>9-C`(VE0v%rwTDPnqdXBS`90XR))yS?ZKI%bhda zbKPO?ME6>D?RowPf3kmfx?8H14;LI^UBbh>g@+l9@jT0|3hNE)ZELUfh4r)byOnJ> zvpd=++acSt&$iFE3+;*aEc;q}k$sQ7j8$1@zsghoz&>DqXa8ZR!QI<9r@%#hnAT9| zLT8dQ&AHCGiQ9P4dCFPsR61Lo51mh)Lol>-w~?Fcc5-{WhTG3QC(441c8lEE?#=G) z?oyWXd3Qa8@vghi{n9<`{>k>t@$$Uxp6LbNU~iZ=#uHES7VmB^<~<6%R6s9pdwY4d zKYPD>*?u#>BaAG>QFgX}zF+81^k@0k`iuN~{AK=={yP6v{~iAW|A7CU{|6^eR1Vq% zrv$wMKR7cO8eAAm3Z@0u1vdqYg9n4Bg4ID~ur>HF_%t{a{1T*x8-;Vjox;7tMz~-2 zobW~A(cz--?C{Ou+rvx4kA8{QZGGJH7vXSi`BCz2QG9x)?9WN>6yq&PAc zX19QcRu)+iSsQsdvg7Q?&dC1AH<8-NKM@h)aUflinkuc7Zp!J3tMpOCGo7GZsmxPu zRPI*pS5_*|DX%E6E4yGL-zq;TlG>0X=Tw#BICky1IWtdOr@sm}{y;wfH~u4b(m6Rd zMyt%-=2zzT<`FZ)Y7QOru+Ff;R)1@_b+L81HQg$)7FhRL4_T|M7ueKqT6?U|tRJj@ zTbXR^wsvP*u`PRmeXc!<4L-x3YcI6#v>&z~x7XM&+1u^+IIX_6f3^Rzn>Z~T)v=tg zGaMoq<4k1ZmpBVz(F<}K#r__W(@L(Pan=>w;Hj{@U-xC;hVyX!w<4e-VDDV-W~otToe8++#qsdqC#OO!{HXO$O~Ey`QU$1wI9)3x>Mb+exuf^|ENv1R$4dhbj{WJXydfW+6-;BcD+`r#k421XS9vT zJ@0EDX$Q3*wZAnzOYf$i%8_8{ee`kqWPOG{Tfbf}6{0B%mVWQ zj)W`CdFGAg-RAw~O7l5$m-!L$)7R!trerm=T3a2go|bO)wa&6eT9+j`Nh%{b3=>JW z8`?Q`p52{;A+QHW?P2y9d$K*pj@ozF_u9+tr|k{)CV0p<_Rscj|3fZv!1>1c+4;>$ zb7i-Udy3o3_1!bwq3(t5BzKy7oqLnJnA7Dc2&~fG>VD{c>K;PYO!pdj(Oj>S*V{9o zvva(Ql2mrHce}ULdkoQJJ;KSm-adqr!``2qJvn}!-yLx%@CW(gne$U*xRF(8vXdHbv0v;>i7xWpI(zk;=%{$cK?nBZnfth*L*NllH(w z(v?O^uF^^Atr$u_^ZUz0rS3 zo6Gel_2=~peN!ywoE+WAG#VMrIh#8pnOLX^7aC)XiNea1;(vEqMLF{8 zpH^GkH{JIU06up!A+qLP8?Upcc$PQ7I~SQ|Y|2Ts3AN%K?{n{K?*}i_Z{#=k+xVS* z#kc$c{<;1rf2=>>zs0}XkNJ=K<$i_#hX1y|7Zv1Z|93w-Xclw~VtdcZY2E3+Vt}2| zn0kl%ga?L)#J(S#GcbBMf`EhyRYwb$P?S8SyJ9MVG8oNe46^7PC5kq9ud-ZuTG^m% zf_Z(d{P16q0?cc!dV{(E_O(V`uWnYis_&u4{H~^J4YeFCPwTFkT9C@RlzP1Du=YFT z(NNFPRTx)TAFf}hkI^UU)Ahyr{rWO}MeNOjoK6>Bgm_+rfPQo6_Rvz)yXQmeL)${{ zhV~)Q9Y(0_Y;-qzBhH>>3^gt=MjJ)OY#3V1c-UBDtcPf}8t)m^#@EKL#$Sd|0=t-} z!q5hqLt^8H#+5w)i{-F{Wnaj z3S#=o{vIVD!)XpN^>EJM)aws9UF=*Qn|nb{yJ)6+g4@>Z>?*G14nT+-<&Je{xO3fw z?w#(#?&Izn_a%3``yL|B@9?LFNg=0?HxOZX93svP4#DdYieu=b&v+ZX*Sz;R1`i|R zr27qFPa)s&`}za_I}s;}jB^;uNe>zZIYC~~JurhH7#Bx1PSqt6Ew!KR=p z*d2Tod>1REeQOKcj3^UQ^yzK2i=UKPrDKS!zqQ9d?GZ z)S>DH=+Z^%Z1raKc6F)xnEE`lxJ`Zczo5jy+OQ_t7*5jp+AZ4MS}gYRxjFiON=7rI z^UYg0<6`EcX1Q5mzG1#??nU+a+5FwiwwhTX%i)Y0Xq|5rTXU@&kdp4Q*2EQ`t=4rCLaGSd)xjo!7 z&@}qH!`+MB%iZbd8w=d~+=tv%=uewrJ$u~G+#lS3!+cKg+SX$|GrYMd_;(^kJ?^dX zUh=kk?|Id*pI^Pdye57Nzl$F|)wlhKKg9o+KhD3xzuLdvFNOa+;XmVVMEQT;|Hwb+ z|LFhiX9X>TcEM?Z8srB9gAu_c!4x#H8-iPcCBY-Xv%!nOmf)@6iEefxLHVXl)eaK=f_SQmUD8nk2+8t0)b3ar>gVS zThzPNnEEJMP=)%2`nI}P{X+d2hLx=~(>iJ=Yaz`;=RO}J#zbwFcCEGuJIXTcNo}3> zs`ifdfp$RqPRr5T=pB>%>U{kI{ZhSHpR3=1_318*9xL><`pf#~`q%modS<9mG}JuQ zCe%5kgsjkj(77n&V?#4Sb3+S5ccPG2gkA~l3VjsXANo4_-l(wg0i3I<3&! zPj_5Mw7|Il`^J^n#)OsderKigob!tFy7Rg7HF|JY_eu9euZ4FKg4M|gR$kN-?CV@~ zw9(!~?@Dhb1X$t;1JeWO_A9(+VPl))a@L35r`~sQeNBRyHT7Hi9XJV1KMXq?iOx0? zTD$>S>p}l9f35$L|GK{&ezp&-?MJ`XZxEaiv@k8io&sb4w~FW%4KMBGtnCEKyP?RS)r`L?C=uW+;(LT za@b+zcML<>YIC)X+F3nCRj_76V17f?Vd^F77KVvsh3(|D>jPrE@|qCKRo&{k<{wU@Nlwe8w2REe*(@3mSjO>e5V z&^znh^+4~d7w9AODICaA{U-eZ{SkDD7xXvLB=_q3^;-Qe%&j@0Q$nYQjF21Z7dk66 zEHo0M)5Os9&@8OJw}#3>k4HlX2=QzAK8{5!E_Qnl|wH)3jm^o&9EL6H_n|(RJ&o@Vyh30r{xpU1s z&Bf+2w33(2&1MxQ)I(?`|Cm`;J1d%pwJO9RpRiZWv985lbr*;H<0!W4uyE|Kc3aif z_t-cjy8*kRvwenb*yq>Tg(1ucTypbO%Gihz)h`f?r$%%#Ct6qwn;qTnv}(&IsSu%4Z?13Snk!I#0e zL2dAN&@y}y!a}cbUxdzog)e3&&5DNS!{hHoiCGn1jS^ECekZ&O7XJfG{;zPuNRvqG zNIMjnGqBK}9T^_EFfukWDXxIu6uB+(C- zjL={l-AR+NbaGTAUzC~=>J>;3 zSF2GDh&zxWmSG}$8EJNh`XM&$Z?Mj1X^pj(m}I+ZJ&Bh>sh9) z)Lua$e^1+u&hwM@kCvsk)ARJ+dPqMzs-K5kd#OGNYwc`(o_;en+k4qeLIHXKBl%{1 ztNxz;A*Pvc^?x`unuc0%WONS&p}wKPq4Pr*hYCZNho*6CT*tw2dnkqw{6y&K(2JoB zp)FW7cZT*PkC0zOnMPyw)yW(ojxod-#;zJ;M2n1B#v;y<2T}5$Wm|1G-ZehO*&2~t{XPEuXv(4e=h2~guk~s@SKOq7=fe`ef`Kr0ae8=2reu~0hWBzKUS&gkW zR(tCd>vY7Sh;_C#3;}uqBGJ|8V)r6IKZ#KEvbEiMH;Ov84~6V|j-4aO(K0GoHx3@l z?t}ekxP1{v&s2M!eZ75~U1~oNH?TfyZ?rcfP4C5ETx0)fXChCxaXMp8R2+k?*3TK@ z48wmhhRrtJxrXg_t8*tu(Zd`@&p0n3GVONuA~JpF{O(Nt$7$@gaP!=gk(xqoUw4pu zDN^^9$lWEF7w>W(a96s|xE1b3B=4%@wp>@Qho_;o^~X3c0_Vt;$leP$x|VxSVjQUO zHhERvZtp8LTn=hm$5@Ad<#Y~?m#_N;XT?vV(LoVgXK`?Uuq;@SVn9p_Hw-rocMG42 zTx5m&2tBP$^Z?uAXY5jG5joQ4{~!ZZN4}2y8u<&SMw-+FIjEa*s-h{@|IkR-TJ7+k za&$CBp{rKER)1ChQoCuVYMN$Yiz?7A&?abCLiYDV_$yHN#o@7^}T7Z+| zK1BJaob}FT4Bo<3kT?T6yM5d-ZVbD2V=UNrV9PuitI{R@bU%87f1kg?-wY@2k4Swj z2BQ@iiyC5OR^hA{{JdZe<`iufBEY9>g5Ozi`B=~SJ0UbA`Cazx<+Af=kknaV{Lp? z+n~LLdJ4=F{wC3B~6$%zDEy>dnP(`4}7aZTBnpH&;f*aoM8dysKEpM{rxd$!h+B zI@5upZy=K6bpKYQ#x+Qc`;Zm0vCC-~_D2O*A{xdx$Tp#+e1{3H6?$$2A#if|hA8si zDpZp9!uzq=H;J5#z5YC;yt$EEk?+<--o}gf8(zFLX$q^H%`v2L2#r#%!j$%iQjY2O z1MDXMD7l#7`y#4MQLk0+!^~TWmE>FXPqifqM_4-#+u2-{(Z?|83K!qc+6j7l-OvZ< z(aZEA{T9xN7xXQ7J%7*}hH^tHXTrsyDWRJ}_l2GdRiZq6i%+km(F1-z)EJ9v{dQv+ z_S@eK8QJIxw!ppSvoP;H<~O+Q20-k^)=k#K)^pZ2xbn|dM%+a=z`g;KSUG0bkL}h7 z`4I$}@lm9g3TKCtjj&?6v)tR<;UC8k|1KiO?_P7itM6m7 z8tu>UZ}XS>FJh|t3|DL;L~=dohjKU-)8`Uc-)7{6L&)8&!)Ju^vCCf`z7d=JGvQaT z#~*~}HAkxUBhi21tBqoUe-e|yP8_Cj8M-n}8pLupLVngUSzV&cQWhv>%4%fgPmq+e z@b;a7b$ubO^|c(~)yTk&wE^12S~2Fy2QW&02aoED-c|(tzQvjQZ@p=#Q^-bi9TS>~ zr}UxF+R)Zeb?B#Ps4+rn2o7{9fdmVQS9sod4Pmrh+@XF^Jb>UK7I!O)`xA@X4&!%! zTxiqaCHGrTVTatsq4&Gh9QNVkCK-*B#i!&oPAw@}53BpyB2bDEw7=z*=2{)r3m#dr9 zkJay@Y9h2PKHKNOhsJaq5z-b{bG(0pOA?4Q4 zGB*F;p*9d@ABge_i1J?J2{wNfo4+^O>PWQJ8_avmRS4_vnzGdyb4r0V87_P)JotY6 z$Zw#jMn6DV6+HMC>koWRjgTAK+MVoE@H-hS=l}%tq4=Ig+gI2{IA(9g4f!zcgBMU- zUyHk&_hX0af?%GH^KlY#LXlGpN1lhQuo?+rGxEVVxD5VrGTj`Uj{V&o_?()s#ZNoMujJ;tG8^tgL*UKW~BUhmV zK8Ou|UE~!sz#Ry!hs5bz&2l5LrYk34rFd1TR!$*Y;~x0IGZ5+r>LJ25+G;8~+Qn#S z*K6-;(QMSPTx<>95F!WZv-Fkv8ht%(ym$3Ox`m=O8G5}b^ng&YFeS)FE4Dw)A|I z)@yJsY-NWx2sxoo&^&*DQ=Z5)2N|P`8OC+SoyOyM6`nUL@Or(5rujA|;##A**%gmh zV4fKzY~~`UbhY^&%=4tUV{{_y^FC;EueCqEx0~U{IurBWh4y8LunX-+A--)0t)Jui z{NC=5VmBQZ_IxaI?-E6H*!{z8$U$`#t1%m0Yc6`!W5LVlPC@*H=@981iC{}8KnWTd ziH?a#h3WB-6GeRli`Bd88QN8v3Evuml06DT_%j%h+Q6g+p+S$}oSk7@Z_L1o+ZJgu z2c7C=dw8r*UvgL6e|UP!NQ}(W&8Uu?#LnXIvkC zD||BI%`}AEbP*6FEzp)~&ttmy1P_9V%kyk~f<6r^+&%g#{oc?8n9gdA)~03-F{cps z^b`W%UWhH%T5a{Q4z5n?~y2W(XVj& zwfE0s|Igwnb%K3LWeJM+k)AoJj^xJXma+vynx?2A{)C=e6db5jL;6Cha^`-Iz z#ZO{wZp8Gs8s_?*x?4XPf%pPMrtzU-`zA+sg+cXKzd1t5lZYb~1b0PSgl`F#hGT>d z92U!5nJ)Pxk1O5P*AXAmS%ETbIf`e**k>#@J&5vJ`wr)P)k$7y4pz4kj0H5{-RP*`VEdGV##-+W|4vcJ z>%B5bt#Y^87OhcIGU6QVM!|^kGvX0lg`DPHIlT|C-w$C_ZDc%YtS~Y#Ls~Kx z>)fDyK=>6rBqPp@mZ`h6!x*!UaFAt&at#fl9c#R$+T)HM8`*9%x4nA>63|MFGvDJv zS&0L;JQzS6!CM63WyHB)Y)DB?>*x|iAy8!pn&d9`4*zlS%!)GN9CVZMk1XOG1^}t9iIvzczj%PA)61%S=F%>EU>eRGPSX5ywy{7Na~P{zzw| z=iFp2f=@kQu0R@jF&a1hZZ}=45Axm%RvULZcA~p+7%lf&6U^7cSN)%`ybOZTNR=7! zbD*zs7Bav(oGg`yt=p6@LU$Vv;=^i+h_b=^5MrE*ypWjaOyxQC0;3Aw{~q>KwRyli zX#NYIW_Q20FM?u1Qgwz@#RP9-z;(t(sA3DubqA;aF2w)6c;XHi2MNopA>6FiIATa< zrWq?)nA5VwaKZ*gS%oM9ldLH?Zc;s z-AusFrID8+uM^_>YvfO8BvVjGR5}em)JUwO9=z=i{b{`!A$BXwmpB=6trzWX_+xrv z&I`FVaR>SC7PkOjN*{uYo(dlcPa#@X;wMx^%vVozu${`O_)I;+#oBTq0Tsp0H|{xN zl6jeNDp3gxxl^65&3C%H4%WJ^!9~9X{Iq?1fJ~ye4yn^{v$xQfg+>{L#yDe=(b-%V z-vgO(Qd(@k=Pw}kaaFjSpn-Kqqr!HCt56sBgr$N+yGnDn9otuu(>^K{W=eU?z*l3) z!=<68LS@DVqrGW6tFT?}4y2+)kIPYOPS=N^^^L$HRcu7;VZ=;K_KLCMzbcORlEgT> zP;N5yY`uvt>n)LCPS>ZhS$+UkN}kkRvUz!?!1%svA0R&&aWz)h{AQJaLwe zLT?*~QE>_}62-V9=S4~)^CJrh_A4b~Vo78vkypzjD@qjC>IKPga#6AnB| zi479#yo3mgG92qGvGA84x8rswRm5)XQ6xLd{>7f6juzdEqwxUBVmX@lI(&(h{s-vY zhk{=Tjcgts5#EHG<-2g3NUw;+!yAgMH(lI?k`?FkJB1WmkQLttr<(?f#5v}_%*)J& zu=Sr{ooBs)YC2A^+rli#Mn`OlRrn6PDV54$+!{wTDYjyIj(5TwOt2+v`GxwT*yq!8 zCUzf%eRUjhvQr2$C?;BVUZ@1u#X@w!QsQQpU~MhKO0_c9>Gqrs(Zs=0L)<}a=m^HD zOd}h2hKvfHYqZDo+6}FzCuWa@&hP$xVW~*`aIz$w0V#}v@kk|!b&Oh@P*FN!Ssxab zO0y*KJMq`(FB4;XH30}eSXT>fRhGEznPRQ0vZVPWCq)ete@Sz54Dor_TX)0X-@@m7 z(5l6u*BblO)mWz9CI;bVr?*??uH|98fpw&fHwUAADb~j&DcrFAgpWVm{DmJ}7I_an;h7zA5rx9R)zr!hlp3w1ZT zBWA6}N&dAt$d_ue;t}yD;Ia}#dIpj2vs4MQ;Zs^){dLrr8Y03I2ks?^urG!d86C{d zIC3WA!F<+y9!vB4*qEnarf7u!Wu|?jy}&MUUUhzqVmoVv9Vl?0B_dP_pU9TJ8k5(9 zY~S~io3nwG&m?2&gK7iqL@Zfb(fNNwaUDx!$@x%BEmr6*XptfNF{j+=h?8=Y_qtc% zJA`A>kw5VzUTWx$+3XFh3bn-TwNl%vo#Js&(cY?!*Whfz_lBz%!l}oqlaOHg5d$?7 z^Fj_HL~D#Rqac|o<11b}=xJVyMDzka*G70;ueYBHq-kyFqan2gdu8ccE`ob7D&WbD757L924V)mUuEY7XC^fEC!%`}>s3lOePvrNmi z?y%2x&-Knn@0-ZM90VhSCxZ8coh-jW{I!h|G~YpZSe{gKG=qSjk@_gTkch?jek5LT z2)B}s3AiK5tViJ21E^;&;iWji>~4ByB+8o`-&(g4D%gVfnrEDC(8DQ2UtR6Kg__bA z3*aPg3ZAht{9yaN2L8qVW&T{h#9xAo%V7^ZKnUG8VFXb)NrO0%<|w_CGYJ^jKw!x* zLP+jXU&Lb66i3e)+CX9ec5AJ4H*_Iq;zVvWI@@T3d|w71eZkyk&bL;?BcvB%d?>XS zqu~_eh&Y{S_G^e`Pso6K2x$Gr4H26Bwb#Nwk$^xhUYH=#-Jurd&(iTYsEj)|R0w;nVvHTBl9D+aYHY3(`sM+sWZ3w7c2r+(6 zHdY& zWg4ct{U{@MT0Ty*;qH4uv;h{c{^9e9l9-2jdN1)2ucF<30(E8}i?zp%n~%&j3R&wq zLcSg#5_KyQR5g+lqw|L_=8StjouVLIw(M~Bu&)KWC!Gm?J*23tDue8LNWHoZ4PEXu>hlwOP5}R9; z)8W2_Ik^KSVMr|sip3Hs4dZ9|*|_W%h}SFf8^+nAa6nHYfMY$;X}|IsmdBf2bJPs| zBHh3+m(D^yZ^iO%$!XcXyBl>MAgJ!a@KEC38pb#9EcI#ia-3(eycs#|PZ)`hcC*pO zoMv4eyQLU$qXQ!C^lbpqJ-2CWHP>q3OkqVV0s1U-q5q9Jb#bVR3^hB5s%-rQJ*lj2nr#}CB|8+@|k zTx&4`|1SvZ{W!8mLKpWCn|LOSxhrhA8IseDcom|L8870{tTH};ab}ng@c!9}1ZBNJ z(BFsHsKxUC#RC}1DL0!K5fQ|`lOy6Y_eTQ!{^b3imfk7xw_k20EOa$a=>p>R#t1oB z<~I^ZGOQb|e0vB+%D%iaG@t$Oh5HR>qfDru?T4fOnRFP$`zKOfwzP;2lX+R_f3w7p@)U#c142Jt&^&ebrQFFt6mTH`hL?Qr~cLRuB7er z`F!8s&*%N)ai{Ve$;Cscg%ipl`w>SNvN;2-vJM}?J_2L!N{MNu3frRx1xR(cB-@D z5h}bUf+@b1DgG|x%RNkE!uq+!_6Q*HJl2d4Y*%13w%VJqVmt&3oZz-g!-?(3uXoBm zX>VMhADgk#EpE!~Tt6MoPH-)OCfS26qW3CiABLm;)ZwR0H!p#pNS%GkbWdvYFHF~H z1Ne!u!1xdWxDnSVci@<-NQUxy4CQY6@*X(T%_zbhT>s}Wky|msoxlKh$oDu-wrS*p z286G0ut`o?i%`-T>>>rw4f1|^CVwcj4ZGRPP)e^MD*Ri+XSNzuVJmy;Ss{Nl7{!hIT;&>|$B+1G@>O2Z)e4hbwH!gau3bo~S@~|7wSbmNz@E~gU zdme*#rS}`&DEju(%+JRN@ac(M)Iond=GzXB_$<-4yi93X{5H%JTw5~Yc`Nw(5Z~)r(I1n#-+;#2aRTY@O#OM$5D{J_&zIH8 z-T2hED%)@eCo%afAu-ux`!jaV*OB|)W(F}aaWvx5*+66bm|Vgu_;KnGPA>3Q-_4?T zPF=y4wuiB%Tb!FLL{yDsonV0-XHurB0-hgrgvI8*&eYj90?2=8<;4nOJGt-&-MC%1DN`S(q-J0CFad_lcY zwIFD0RJTg;=YV>YU*MejU-fD>&~HNrZ2^sYoW0ILyzhSjR$jyFQz9~PC6mdQi1I{S z-*u&F>+|?{F1nUVH^f)nPW(F?-1oz}J>lNTRC^fpQaghS;v@IRbo@=2;%dR-JLvZZ z@#^$>vRL7cB6G~a6E5?*yg_g22GJC_7w4LY>}?@~+=Y8>2eG}~ zI3#j`0|8+JJ&7gxt-yJ_Yae4uUKU)%l&#=g3j}Y&wf09T@UMhh-igk9Aasxn?&J70 z|AZ6$7z`}`D*`H_V8;yL9bShW^ATwt)Aj*@he>c zLzm;<(hFkG`TAD|sxL~AV(?!AHPe+Pf%lgQL(h_im# zc{?-4_Xx{81d{Ei=BE$@&N0~E;PS#SKIZC2k2r&QeHqM-O3?ET>C_U&^*!!E_dy7R zciB!?;R1e`1lBM`U5d%-4zG3>{)?!0D|W_baIakOe$iJ?=JZD_H~ri~N1=D#N0l~{ zpSq2d-g-8#pZa&<>V3ukD%$h~|JB&ZU6ig1`SeAci9@Goy2-nzr zxLBUG9Y+-T3R^~-y$4z37>1;!L`!aRc#->Kj{6-C!rnfLMD!ah6^EqdPS{tjK)tpR zn7$MJdLz$uyZTG@IarC8R8i0ZFCXH|5I(&TPJ5nr42(Mpxhf1vr=|hIlCrl}yY~ke`v|OsK z$26VV)?upFbjk{mNY@D=E)JpB%OaY?g<4=uDWi-VN!u#^27iPxDb5)dx$GRS(*ozU zOmNxAK&Qw|c8qs7BuEToIG&^A;iizwbto?uj${KjVT^$~0UMR!SdNl2nc^4KX{0qR zWZxP>5%i5XXSJ75Kn^;hK;o?&(y?7wV0RnXE@E5};_0lA&YO+}D!-ezSR~=;`%va` zh!{m>62Ipx1dd=-s@Wq%DMS%O37YItd%Jy6KJKw=X<8<0&)J8V9`ZQarb$-L*vlmD ztw?nWYhD0@a}(F5s92?5f-CHnJYgD^a6rwfIdxba!Ie3#7I0-wGBC}k<oaP$(M@`kK!5yYs@0uVoQXy+gL?g=xzH`)E?-wddHI4`~ z)vslASNy6!Ko>On!%WfBT{`HDq(5azni8p>#rgEeqQ)d!RZ!pEDSCG68kE60RN+6d5Mj&klZ5EK3G=mAeMl ztHo^vOY7VvR&0gG+(|5d6nnRUF(~5ez{WkovC;F$nm8<4AHwz|XT*w?q@9y7gjzKp zurM38F$3m;6C6`Bt=~%6GfTtIhHBtnV{n_@2oyquxLknHMT~NdHY_L)%4al(80}wC z6egkDrmL9_XBN)FJllu`Dzi3qcssk7K&pb>K;Ew8Xdp@|Bokpi5Oo^nr&6bwQP)VX z=ukMqP}sfb7DZ}iVX0}OHaYIYIh&ay)e7up?FCLujUxcycH>wX2Oq0BJ5f0GBqt;X zSv0)BZV8+NZuROieWKJ#LLE9v#MIW=uXKOKz#lPt4#VwR} zXWRqaVp-l+Fobn*#660izrgfTL=c~Xch!0H9)qU_qnicWajhhNJs60D?Ljne6)}?< zz{`q=I0;yl0yBukNX46^QfvuY87At2YS6gM>C%H|+`>4{6KX|1P@UnP}Gn3U9igl=3#cDb5&Aeem_#-c3XI?eAQ z;C^vk=#`>oo^~k$nsbOIRiWxo9r<>Fn$1GAzoeum*i-wF|MJ)e#%Zad#85qonH8N( zplGvH#41`?Pkly{(pP>#^eT!MycCSOlB~S`lFC(!vK2woYK8LXL_tkT!0o3e@(YkV zMYHK7flZT1>e>Ta9kaE{`>>0gN)KuG91i3Bf;*{bDZ5a4bHv4<6h??n$`%{NiB?8ssiA?I@yR5ZfcwGWF^mqg zQ27Q{T!r;R$H48EuDOy05EDj0O4=WZ9Kkcw^J%K^|m}BJ9O3Xe2Oe|nXV1Wy0W|C{Ad=(C$7fmjM5~qzY42>}k6`9`j zOhXFiI?9ReVG`@rE>ls-xV#+F9NS^EYN}Y~eZZ8`h$LX8gkg?ooFm## z33G7PlYq9KgQ=h+MS<=f%Ggg4$8dcc?B*M(qr%Z^#!;7mMHyrg;?o*Tx@^k3%T&L4 z0H8182{qWuJXL|IW(i@c$HRdTD`A==kzqU;_Y^o3bDmEIl3HOXlzzgtPZ97L?#(F( WN;C99gopjo`@2jlmWwx)?fXCbawJ0l delta 183945 zcmcG%4_uU0_W1wIFz8sLj5_F~qmDY-sH37{VPIh)QlSn1DG{--CZnPnjorw>0D~UJ zs7t}N*3u5OZ0i=AY*ATZqM}k#Sv!;DQXksS<4P@UR;Qt_F7`zhZOwh zTrEkdn#fFP<&M%Yq+~&Q|D%^IkIkGqsjbH- zC31<-Kgg*r;<1@iCMbvY!cFc? zz!K)bFXwnkGQejH%h%3W0)^m(loH@m^)Hdfx_5KY-M2{65d26`MyU`!6ZgKTP1igY zqo03RW9-u#hv%ezt~YkUzij#I!=nU>=IFa5n_lA{lda7EC7Z8XXCuFZ5D*hfY3}|Bg{z6~x*{q+exsu%-X|w-l`SL3z_gsi{ri8r_ zIaPBj`%C1C6+`iol&vI`h>GSP;I+_y6s|?~`MJt&n^}HO>0{T9x?+6sh$vQ=)s2do zwCjFU+i_mCVfd$fccUb+@sX1jLh^AVaY8y0wK4=%^aJEz$$>0d*tF4?nVcuWr77=s zWQi#3w$V;)-skMK(f8|nR`3c~wy`+<4BMZ@!?#;S{*_;DT{0Y<2U>=vGsmwsZ@q{= zvIq1F7WhX}P0I)sK`Ye{Bdh>w1Rlh~2e6*FlufJ0}_ZKX2%*<>55XUn+;|^*| z)~6|_;NivtVH5Cw5H9Y|C=U`Hadm7s?3uIv|=NN&BT;-+zxrk0VCl=mC3 zlI&mO9-9`pS1<8)etAR(<^4$+LDe=#&9Jz8j7D!Nv|V%(bem--AskbkXDb+vc7DzV zCYWYppGkq2uA*Tf8(WoUD@=n1kF!I^P*U&RJHELhmvfCk|-PRw91ut@3l|7 zT08!?4&IobyF_DVDFGLIAlf~C8qf@71JWEN)AjhILypHTpi3y_IR^9f7K_q)8~f*^ zn{EHTRiwH_+9D~sJ3!y6f6xze)! z>@-$q8RZmH^;(ncG*@St1BsTv28*0xtzK)Down*MThuEl_Nuk^s8^ixvU94k=6Q=9 z-Ul78@%nx9oVU2h`(RP%!PBq@sP|3&Tgi$5?+V>~W1y@9p7R4w^N*-ksygAL%FBO8 zy;6IGKRm&IKT>v-hb#GS`QV22?}XY2I)-_qV}#xK1-v+WVVYH&Si!oc-J<<)BiBgG z^BaR2Q7(h*!z0n7L5$-_rcEdBKP<&oj59Lhv}H@GQ=rz@*{f2Z*4Ob`r_A%->+qI@ zYkhB#wua8 z*~+i-*&Q>cF3$b$47+-(0&eSBNJ?*J@6K3uu>;iYU8m1c_C~Oat+R~6KRsZGf55nH zl<+_+trqS7=-7Jetg(-R^A{aq7uX9sYQ0DMSp-`-bECZ-CNFZ1QNG4l-l0!-X32k1 zJ_VFty~emfK78YW%J29vUY5r?W?rs&j1A3P$h*seSqtqVyZa6D=xQ+i`1^yI3O8t! zM`xsEJH2@}tFnQW&AR-eKZ7n{aMddbZ2znoqtmjo<>iphPUj@NCo^MTkoI6MsTt-RWY zM>#9lp1HHN4@&I)xy56baZ=#4LS7;v{%dT3o#iUhh*clv!-dr-(6C7hK zVa;;wxp)@bl?%<9L2)jj*(7)ucfMxhK%huyHbH2%`9{4YXPM+{%<@*_7Af7C?NoYx z8ZF7!n}@Hl$lcYMHdFl9TaDFey1h9||E^(ajvFq9d0^NhA6vdT5j4{_q8YVXg7dE6 z45;ZicaHsBCqe%^9Gw6oB6!Iellb_$b0n2eb8KC>Y_bWuPWfBhJL&F?l6SU1z^O#0 zv$q#6(%$_FG|pmeQyQ}_nr$o@@k2Q6$yjui<}=0?ITs|W)BaCw7xOh6xA>CLMc`}{ z<1)5r@w|v1hKJcriyxl(*$t|u6Z6+|>dmw8@`JlP$&BFp54z6T~1YrmXZ)}8jr;a)O+saCe($AJlPiuUzzbU&XXuZxja4t&m1FI#j;1%HM{OLu(+(}Cf?Y&?{lra6@C zlo-1#<`R{(-k25?k*6u2v!2Upr-`>Zo5~Ejx|9bRG*a10cM+?;{Hn|QAoat^F}wwM znvk}X&&AW^RrZss?3L{gj`Bw)@X2DDQoP)YB+%aq`zW@^)+Ga8$(v z7&ywe+oY%pJ%kibJ!Uu_G&`QRfD}KtZB#^i{Na25B@brE`8Fl*d=bA8IRGO5EO{ZX z317N7UCX!@K7#3m#~42t^{^Jwi}y!8{4bvDcKg=I_1v*n2=8Yk+>9CPy3jl)e^p?{w9O-(~RIRSLf{1juof zaF7VU(v{!A(i~ztm1i&@cMeCJAOWZ19WS}~s}WKflD+R-*_+P=X(PZ4sX?Ng6;_umEEq}_s&;b9g5;$AgWAgW`*Bv%cf}ku?o^u|E%#7z zIvO|__pJCi7psh$rN^&`7F_{+Sjf&rS743tb3A_D0Ld}IMvLYR2U?W;zO6c+TMfWN$*~%IQI(%AZ%-*d z6t`l#0Vh?EU%o+J6ra!MJF{_RJ1QqDgU>yzX<&b=qa|r${)Y9uNqIroZ3)vSUizd) zk~% zr>hQHKTUZGmIc8kHh;zzuUtMwIOcKHsbJ6R4DexzUuWEgYwqnU&6ZJM%~3DGybS!7 zO&*_~0Xa;V3?AsX@(1?v%H!9^2$6Yx!jIYTb@QBJkdDcf5c5#quOTGCatB9@O(-ys|y!%eCrIm)%rx?qAPbo)W4 zzug-3(smmZ)~FmA2U~%#qv5?PE=PV>xt=|Al`Wf>c#8y&UtYvLi^?Gd-B33OoE{B1 zfYXY4sWT&u+oIxurk1l~f^`*r1M1^g0P|yc8jM0iSIyRTf6itmK5;|;N}Ppc+AQfX zo;u)%?={3KAL5Jk+BVlk^`YJDqNS>g0C z;qJtqEu0hyQqLV?Ppq1M#fDXqwCv;-9pq+%N-J|PL+Gx$YWo@Ovi9oLQuPKy^#)`0 z1{3Vr+2!Lf4X|pJBsREehBZItku|Yt^1D^Zv5Fb$i`hJqlP(+-<1-2;--?8laZyYAH}=BQH&z&(`%AFqW7;$ zg5*uIwp#a^c*FCTR|@B`&6XoZmTcD$_z$ORfDa_Sd?0c4aEF54#ns8fO5W(ObHNei z`g6e*2%O3i4A@7;8tb{TQ6m6c)zPGDLxuH1F@>-D|0`l}WE2H;>A&Ek-!`ED)eyJ& zT#$(X=Edi}v0ZU4nKuIXptrHj;AF3?UbISRH90B&fE>-W_$>Fp=`IVDz^QaahLyzQ zENc&qKfxXWrvB=oy>pUv8f}De?}9ZqY9h>9Y45`+Ng9oYbzN&QpNP{-5v4X;d50n5 z+wvk?oMvm^p=+F)$FG|M3yrzg&CxEoo~^wuqu%P*OrDM{Y(S;yRC`*Gk^dlj?z*KA z$$#B!_&s#p)4&VAw0~u)rf%WR~0y^)nt~B{yVgZ}76?H!O&_ceIxMbc0<}&*nO2 z(`w0rrIDO$kk=U(bngE_3#mr@fLkzWi&(jH@i^-u(TT-Y$lRr@-D$bJ7pfsA8|AeI z5O?w+{6!c)fJ6*O40}zZ)182RjR=Gy4hxw_*u=EiTI(Sem$u@fKgdwA4CQR3mOYS` zK5brbuO(_pXp^BU1I8>ER2PEZ{d-!CHU?^vo~F%sgdI!2BH}ikmgzI*jDPfBkndVk zd51MEgJ=3SyE0>nrI1rvC)jl6ZmM7bb7w3a=U6aOr=^QoYsP$S{*SCTV}|ype=$ww z+NiG}g`8@r;%Y+%#9|vVFI$yzD7^7dSUra~6ki|9UxO=l+w{u4^F^AFkFGjK_~B9D zb@VW62Db-u`==7wiOd`LVrEX(;-$hUM`g)(8DQ)-$KN%w7c?#d=G!)yKbX=XzPY-{ zW>MxxXeH*{5zT&`WuG9TZs#+q?V)X}kFplj8z)9Y-o(9jzAa>mNP<0%%E-#$ zXFFD|uiwGwDsMN0Q-b#}5P~zb%A?YFFg-1Y%SHXbj%P2|nupn_oave>HYevw&$WD^ z2P(P&_Q4F!G(Io747~S-^`N(nxML2h>@jJ|E0^Lhu*SGxjX{17X0}dc-*;ldF-gug z$ZH@CL%Oh$Zy`;H4wGlH<=)kW=TlHH9awb%w1ku0?754TJ#^`HTp#iOa4)a?ZtFt6 z=!U1e%v;6G8LG3^a2SSpv7j+3TRwy$7lEgD+l*)0W|#~) zbF!5~kF(s|RoaNh*{^f$+9waQgSqp^Zp;R~Zyh{F09;kFxw57Z~p2943^^7 zg4NtKPje}I8bW^$EX;}aI852cqAuZ6eRXCUSQ*3&k%^({4TlZ$+CD!FF z&`e~%%$uP(z@EyxblQ%Y!t7u|1To7-n?-KVXdjT-!0zP{=?c7Rqa>R=o5XJ09bKC=E%FMoJtpo)W&MwUP5QIyr--(lza;~A_y-;!edL}UP-B?VW! z&<$`%O>-Il#s}6xF|fM&MNyr@(R!!`6xyj|A>xw^D7|gt;@bj#o|q958!J{vPS**D zd}b!3sdwFS`(0bpl_zVsh#o{%2Su7e1SdKj0aerga z7R=IiLzgL7a(U`BbU?|e&g%T!>ioRw`~u~2gx+-yI0G~(S1$vT<@?PhK13_C!9THu zn=IOlCG7f5cWV2p*z21tQ~&m7o*(xJm5cbwEhkgVEYp>rPO`5zEs380dr_V(nk^Ez zSTnc;<^CRa`OOaP4}EO&&GFiy#q75?uhu-rl$-OkC03SvOFSPE%5S-Ixv-QQ48k>Y z-)mDo`55{c_#CIw65#3TxL4%s=1f47Ubo2VP6|n0e56Gk7Ojqo9f}KFvt&=4_ z1j^aEc;|>OPS%0DEpIoj-_cP69w9hW5z{{K>b6c+d25^Q(SLyESKXH4N$7;u4vw_n zMLO4yH)^&nDjzEXuPHZ;H$r3Sxo1&shxv%B>@RTcaMvW!()YASZ2|>e4?I zDY=aQt2c_6%J(qN9E#*GHL}6h##1Y-hV3#wGd17>jp<$Y@TPgd^$h=*di!sln4&jC zyl2usF;9Q#lAk&FSZfYWV7QUO0e0n)`=gc}NmI6(*#6t?KNsul2HEm^7Ek4?K-heKWL;8KN>WvR5*){7%kNg*l%#BDo_i)~Umaxi_pH`f z*{AnRHs*qG)kf~wp`$!@v7XJ{c?G-jUcI*a5KFoDD$Pf%>fZF3=|6%?h3yJu|2UPd zaasY!2Q^=C-;~ht4qQjzR|ue}R;Yj&zQQ%v@tVg#-vm+uvOf=_+e|RHfNBn*_La3@a*t#2Hzn!^Ko*-i1^Zk?Zzy+xA-8!>nM$hOPY2qo?;%ag6zx%@GX6_=!PV|%M) z^(+PETEWXf!M@0Eo&;yTMrCQFp3V8i($P0-q_iC6ZkGRxslt0?$#)py?--fYCL0#~ zoDUcQgU5r>JK0>FY!N%D zqHlydNHVx#KBxa%1p8{%ELbY=1&{tP)Bkd2#F+>^bNuq!i|aRu^-~KB;;ihKv)2p9 zraJHica>~7v>F;{tzOR3!~Q~6Kb*OyIn#5Lh5zJ39ApmjrnB7h20g@j`HKzwV%1tj z`2?0+!l(kH^z7fi%$)eb*E~*W4F=^&d5?YZ_GKQvAmO!|p@pm_r5{cfJL!j$Exc1H zV>kuZ3L{x46Ug`gME4&(Px~V)4jV)R6>)bPT5*UG%qS8a2gQd(^`O5)Y)a{hg#VaU zljc9AwT?Ynx^c|(jT(vXp*+dHFLi1En9nvnxJdic8TQzNGq{Pp{Gk1kkfVXcSGI9M zcf`N2iQXS(-#mDQ_OF9%@%F`V>uclo$+jn<+h%a(CfO`mPUZ3eC@%CTFi=OD*A$oT zRCELEsqGe6HnXTnz`)z?F+T8@7cArQzu^!dKLPA1XK}P^CljyH(T|0 z>el3Gr21;B{tE59(`@v~xu*AFG89}aibc)LS4P9-kdu=ydY-?4Iodj7ecDC(iDShY z_@sMGhO+vn(e;Tl^_NFo4Ck?+YmwP_jlO>8Onq{M^_TOo(yo~iXqXX&liJjMGv+#$&_WTd4-&6R3+?OomDgjHt5V2)F{ z7M`Kuxw(bxKo}bg_Tr!uj43jExo7DgAsuc_FZ~Glo@Y(J;`IOAnpz>+&s)=7Tt#S2 z5r-1Tv)`01xf}|0`q$8kBi)j3W}a_ms%5f4ne`*9D6?x@eqf(v&S3AB&7LayWVT^J zHcTBv>qmT;F4|}B4{TM|#2E4Zzg{Yroo4HHOt!9pj<{hX-*+^>qw@E>s8Gh-!>n@0 zf-8RegQ&8cT;i;Ls{(pW^;=cqH=ms-75LV>&Z;bX6KX#)In;g6{=Q>weeEp$V&POl zF|b~S#jY;C6W3z(AI;J`X07MlKHq>RA2{>BO#TW6KNGA~r}8OP{p{I#8@Sr~YiH}X zO@9#9LQr71U0J=|Cq4J5Iekc;kdiL8R@C+ z@0s@DW%?ZGcsa_Y->{Vr&(qdIoQIpVuJ72ms;PX&v!H59cJNxq|J8B->t}lYj6F8nQODmqrV!h+G`a)0?Gw0tg`k>^KVXH$a7Vn z-g~mvqt#k>uspWlBFm0(M*q@4qjJ@h`@W;Skd%x>g<(?miw1*!fAD9YOq5IUI zog*&Uy%m?n+;#J`wjJy@bqBRA8g}awv-yYo#3lUWd3-wdgk?b-Bm#G%>y*(_Aln%D zil^VAsoL2D3aHxo9Q=mdwvP2j#_V7do-E_B>z<68$D=8K`rrQ|(zj2};E^WP$7HyzBT5rta{lR9>yEFT;M;u1>gq1zrWG60=~Mu(ucdNc5Z?2p`EwGZ_S~dF8Gkt>ziQm=Vljv z_U_=>k1U9kV@LRz@>YZL`9Tqgn7XX}fVhQ$LbQAfchB|MFQ`whOl6(W8P6f4#>1lu zxPGG>QG5IfXM$`?@fp=uS-3mH#>bFS4AB5GW2V{hkyAQm( zcyVAvfZI9)ycB#y!wXXHLv-G(p=pO`ROqg*3l>0ms8c9t{#DAaIz;F)a?;)g^-NR# z{d=)R6xY8(|j#j(U$P*VRF~Ayd)I<7F+>xm(!_+rO}PJ9~>k@f7z6gM@uRJJejv zy@@I3gRBSQWh$r1A zz&+qzhNG)sIp~rS`J%pyuMF4e6gOlKcefyC*b5u}fPa5PIPP-_G?B}iU!t-j9SN?` zfjfr9ejrC4@V>$Q#%uGzJimDkw6_X&UhGcq^*Y54du1@m5qWrbaH)|bygRr9I>1IZ z&e10Hu|6BA&9Padhl^psVs0J>m^SwUv>4raWqriXs$}3zl@!rpk zDGJ1RODV~qO7Fv5g?wN)@P&Oj_#eIzaPbS`tiqC=qqJWIo%}sz3{M=^(?+g&lHS|T zgKU2AXy}_}Nb^yiW*Tg}8`6144W`)!*+D1dY2Jxxz5+2Z&2uK(kb#-+c{s8`FVLaC zWR1U_rnT%~Z~u0cri*EO*J+C{VrzY~XM(qR@`BzbM;xzhxRveqP1H7g&n|0PmSO|D zKRnt9zm?`&#B#>~EA*gK5Op(il|h=X{D(B(-OSTmrHA$ai?#A9@lz=9kQUA1QK~#{ zEez+O@{oLC0XcLYVUf>SZ9-hbi^RPun7gEO@cHV9lYOF)UHjbpyKXNSEwyNZU2Dhw zVmN?3U6~)8ES>+%F9w~S1KT3P0Cwyb&tE{w;u-S))CPmc&kI;gRwCBjTl$JLdA+iLN5pQFYHOTX~xZn9ElFQUs#PR&FR_w&&+A zX)PFUl%rrUS{>iHbyYSDM$z_7@V%4oR@`sfHYWpb4c2;h?uR88>;?60WDh)liKlPl zcw_!XbOFNOz$SaeBcMjUU&P}>r#6&(%*J~o;9_( zvb%q0$>^tLf*U43Tc&L=I>Tm=x=6PmqD5k-em8sif7T6~(QNY!(X5UCA?vq(b6(be zKt!`14+~U&3K1Nwcw_M?>IEBXENLxvyxEaqfCg2m6|PSItTINOU!rfGQB5sE?Zejn zz9{=;m>-91bZW>(CxmQt47X8!AaDhluXKYUxN6~7nz9sAb}IAKSuo=Z(Y7W~Vg`Hx zayNXsmdLPM0LQM4{2>M&nnSY10H zI`H-a*7$-ss|{YGGPvJ0r^9Xa;04BFQNqlpN!^{wH55QfqNMl%+e19S#{OZZ7BYzW zgV`f85Z7|jakuzrs9W$1(v^?s{wvHl~kCOp3?_cAi|FD z_#aK?UcGT?`|1CMl%Y;W{33_#_Y@*P+iSdQhT~V; z?tN;bi^t_&8QN;K4tCJMwT^*Wq0O+@5$z_`>in7>kx4WpiGd=ixf{ zuH)YzGK!k;*(JXTgNuza7#(3WB8!bQesZC6y6%AuIQfU*HP0JttKeIsx_ejS$^gb_ z1NMb<*AQv}aCYUyDy_z_OPRJv}wNKKi!-B?r3uX}Bq z3BgnhPJ;G_n>{z^m1A%dIltP>Bj}~-`$5$r6jCQ>Gy5p3Y*{l8ECV!Y(kKs474t5G zdckPI5fh~EKgzysSu+8o%dg_AJd?&f8m4>BLB98=hh#yf`Y7A_r&q_Lt?8geoUkq# zR=U~Bm&F%Vw!O^13AOj+%hSac)sK6twEGXS&O7I`ms+Rr&9Y;yQ?r9#P5HliJb3iT z-h@9#YqifFfQ`L)w(HedbFMxhrXOY7qb2#@?$1L@g^+%_V3Bsu0rt_WtF(aC4(^SA?Pe|CUi-}(4P0?6_D$r9+q>?~4vn_=4Q6^fi@&|& zZLtTp^X&~+5mg)br#>gK-+dyoOrzPI+NS)wqNuXuNE}k`8(_U>jc5; zXSUb(&f0&4Xtn%z#20kGdS@Na`^p32V;6p$!jDBAReW95*0I9$Mi-u;@S_cI2XSzv zshLF{yq#C0_+YB2&Rd64G&=4=SXt*}Hna16p77aDJC~V$WVt3EHnL>zKJZ%$ylwD1 z+xzD|@X_{%7hahE{ptPx(#r4bS7t=K1DDzK<%7DYhem-rE_?GR$Vgj9!_}hGutUqc zXG{*PXO1b4l))(eW+#6gRgn?F{&dvhiK=`H9^vKl6|m~jfMq`o2lhMwC4L-&aIwHC zcqKdp65;e+56dl`d@L{;*1O6-9)@UIh;}QF1_6k+J`|1fbr+1*#-l~Z?_I4d=J6l| z@ob@Z@Tg3_V7wh7JAM%aik!JqBc0yLT8^67RmVnqj+GBaMpa6%r=WC}2P^ZoAzYbO z2!<>3J9s$1GUG#)sp8SFG7pBL@yZlmFxn?jjx7;JP$?*J-DNEt$bcWEtL$J<-+b;YX=};Q1Q{ZAR z>1vv`iSkUmbmdWL2)6*r5A`%e$ae63!JDt`b;(a?1rD0;OA3* z0Ge&UF7WqI7kG{DBYC`;+Tr;3x5ap`mAt>uR;&@ zj;fphflv;r){?W}AXNw3Sr%w_{tdax0jS4?1YzP5*wFzm1FQ97XUpVYYk>Z4=8@jH zaHIeXivHD-N9@F`*7^BP4Q$Bp7!5xg!|Gjaa*o&o>>YB0s0U4hmhQMf(I6N5xp886 zoLewXeDIbkF;i|u{Cjxv=+pnekMY8$PG7|?JAUaVXySjvXdMfsgk9ckX>W5o^8T7X zdhga`<#=<3)1gNkcFQ6l>rQ#vD^NLHsQmSiVCz3&I=M!{sfw+dy`BU|5=djD36jTFqPR zs_w~Cx50g|;I~t9506T$fJyILd!UrcoEO+V-FceD?7i;k8YBC%`xWh~W9+&2Z-FC> zy%&8@r_n58zxmLnEj+gO;D--rv^8I`t3TSIefStV_|bZ8N(Gzs@m9_9y$v64&{(-) z!o^{)!L!k;I~v}l54UcW)`}Of!9L@j?U}6=Nb0U$+&S<&xqNFIPl-~+r6D9uM#8Sm``nDj9q+cfjFi* zwbR4@BErbdCA7Y-MH9GDSGCGswQ62y2Q@rv3BA|<-21P%g#Z1&_I?`RXHVmJVurBr zr~Y$N3|KD|!KjMBH1!ibJQWi_NE~vW7r0S%EDrN(9Sku6*p)(|pg`!m61+g!pGF4H z$|^uHfox0otSs4Hl{_zeN;b|I$hYto`P3h77f7GY?ydHSQ?va~{~tw%2~OE|yX2k` zNVa&B;hH&gB-njU^Jc>&dYwbbgWa=3$#ytZbBME_;Gx=s^CWk2*@GhDYKwO@kLZDz zYawP9#9Zr8X7iYw_JB6eA)51veL!fyp3{^3AJ2Lo@&FEDhAw2)J8376)o;#bcv* zbO&l-RS2H5wn;pf1Zw$Bi9iGQo45^x1rC`vH~+A$=|_Bqur=vr(LvJeRcZ6M;oYdO z5@9f#z*q1t*a5gvUCfPNygZ}*)bHU*j`R&f;6`IGrXCDV&QH!SqbF@1WEre!D8Z0Qd6J1b z|NmKvkl?wsR%Ec?KqCJph~9s#j(_JOAo<6f+V4+fQ@@zE{y%lcQkci{?#RtLketAy zLyHBH9U^{mUcekkj`5EPBqzcvNHMt}Kai^nn+N;N7k}2;e`48xyFv38_Wa+LP51^9 zgcBB+WBSEx9=VW%VbFwyJA5tUPcLwX&kq9NRLLMI_x!-T|2xGa z{;JFZ@fR!PU1E*0s}-y^$NN?be84<|pO^73{_5pje5isc0Vg~=ec&rN$}x&>Nx)tl z5DRQ;Z&U8QUM%bH#0biL_?VB6Ik3XFr7QmiSoT)C1Si;1{b%+1iR<{09G}{_jnMS` zhbL%+A9LAT`$0+)FHG>l0?@>BlXvnGLH*+RSQ3GB<=``!)gg4TX_`cNR(SJisb@1U`chL zC5UoyFv?Xa%Jd6G!CXR7g86i80w4IEvH`9Z^7A7*m;#%6I&RkQe+Sk23f(;@iyv!Q z_zGbYTzXp8F8-X$*3*Tyh-*bdtOReW$KX!%wp}ouVRU3rfA=}oaLRdjX$)b50cRA*w0fso$nsazg)C*#f~m` zbdL?btrm|#7s31SiXGkbeK-5~%>7aS*fLsL0pDENb}{7p`4*PfZ-?t7mHo3dx3S;% z&nkEf-pjlAdKvz{+D@K@GbcltdK-M13iJ)eZ1Jx7Uj8dgc&%W|*7Cv0_g@EpWUB2a z$vABDHo*tHGM>qX);Idc=E8*L)c!LmpZek1#Gl!MFPCfXW1GHQHgPrxuYsQ>@G}j5 zZv07NZ-0AffKc#MJduB$6RH%M2MjjV--oW40;)*~{iP1rq|CGxoH~*& z7HJU9gfvsqq1U?LrwD$E;m3`|b}BV@L7_X9kCNa6{=`Ot{3I_&@NN1Qt5SL|xGqvx zCnOlB)NO_sqR`MdaZrLdj-d~MGdQ;f@^PRh{vANREK`0D-30Xsk2d8Z*J${2Sy4MD zM@Sy&4en^XckpEbd|ehwG7O&EmL62U1fuE^raO7&Q1BS1Qc(z=3e?Yip##d};26So zZWP@AMOFM05-cCQD5~-_1U~h1Ujtr7J`NI2kjM>q;6A*6KNL0rUKGM7AKnV!Q+RE3 z5G%n!0L=?}DlQ=Er-x7ihz9-0r1QjF=ZFP;$CuzcAZjL0&x1LRNal(J)m{cXNJbW) zf*k_y3A!<-XJx=s8$3ZO#x@;PO#@v8e#{X{gr94{oAQ1650mfDj(VlKFhavSixWPe z*0HC{UPMSN$L4{1 z&ufaoKn702AKw`jNH&N3`td-r2^u9)=oFMMw5>at%$Kp&z?36?_*TNH)7%mJp++Z@ z`Mr=pvQ<9Lwtqdz6BJWPJ*$?2sWqf)06i!3l{Z%&Za&2+a- z%wB)iQXhtLfanD*wE|;?jg=2vR5E0OD#;|<9b!;jg2KXJ&$ZV)s9AXQ)q|jSYecqp zgGStt(&xk1zYc1%;7-kP<;M-7wRiyxVzup(#`r$`{0)9yg`Z*e=C?C8mG>tEzRG|q z$7F*Y$3h@Z{u+KKK$CHQlgLf4dglqy61-1bcCvaG*I4zFJ@C8g89sJZ@9c%&E1p4D zo((<)rc8SPK^Y#rg>Cp|nkN<-D;E5+UFCDziPw$2;(*HQa-VVp%{@yvL-3PO7>5#l zr|^|37n%;-t}HANLzo@%fxlz1>`M;Ab22j<`euyd(9P%s?a-gHf@Y!RcS7RS!weq} z^ER?2XQ#}IdKfmq_}^Ge86|pjEPQ~8@Hvz5v{>H2gBbOS&qixu@O${|dhNG&u)eb~ zWA<(uEyXKQ4}Hm|eY<22wb7s6?g?5%I7c=(F)Ev|4W#~rDR13QL6trQ&SWSGn4=mI(Vz(#}e z@oC_qz5G_-U_Q!Tj$rBXYd6_sPdHqvCa#)mbqXCw?Iyl^b zO{9;Hu`j+$(QIUkzMs5c^56M=Q*LU9VKjmdn2L!%1$P&;E1YaOG~TzkRVvTi!HU1X zL_2!{lfTc^>blq$-=}CdHn7FtPntFvau3<-Imr~=%x)f>tF_H%j|?VxUc42I1va3` zg&4c~%ZczkKDcyMYBR5Rjc4oq6aVeLEI5gi$HAI_A6=WB+*c_tE&-dp61GdDVbUtj zd->%lcx6@Yo5!c0V7@$hNJo|I-xB47UBpQ67=#U{x^DUI_U1g%fS3(L05h zuY=MSq@9#DAnl^G6lr&udPHdp5T6KRL6eaBDRm(2q11%5m(rn!MSc4y?L(??>KRd4 z7vg>@+=g_3(k7&5DXm31NNFk3Axd3HJyITNw@k!3N)wUlDRm$)n9~KDs+z<)fM+uFt7h=9rO3%uoDat5S zkXBIYM_Lu8*wecZ*Mza?>HCn@Qre8Pj?y}$4V0E4-AyT67vlb|k<&XydU`J6CMukS zw3*Tvqa3_RPz7l}rGBIXly)LLOKBU@ zK}wsE4k7h~`b`63X#?@JRY-M|mLSzr>OyLuG#9Cn(iEho4QV91IK*ZuY)5LL)Qr?h zslK}Yy)w<*^nCQzzJ znn>v&`iUe;6{IPYcGsXqrc%5Qg`Jc(Bh93=4rwl>Wk~ZVEk;_PqU*r+3K18oFwk72 zE=p687Ezjjw0Hw|t&{7mk(!`yjj0Q^i5UVuH^d71RvKRtV!l#J2bkz7Wt8?Jt)R3U zX;qk_Z*50h6UM@~wjiygv=M0?r4>jUD0L&A>ScBdwJ7J`NWb!IZo3?LPXp4QV^2%}6^atwq{NX&KTkN{f+phbd}2 z6Y+^K78*}P>ZjC!w1-kN(q2jpNc$+2kSd(2=B)#d2|e{w;a;Qzly)LLOKA(zK}vTc z9ip@rsYl8u?yU^5j#4*LJ*9<64V300HBy>_)I@2*W9UlE6gyDZLa7z0l~N;88>Kp= zc1q9I3Jp6{ln-tS;usYM>PH$&X&2HsO7|g6ptKojBBgamlaPidg=L6SsBkgTR7&%Z zI`iwlo(x?mlfI3`x4D#Bk>*iqKw3cQ;G;rMg_QOoby3>=C^lgc#rsgWn9^pXZc6Kr zmQY%Tw3N~!q-83~n=lt~g$e^rLRv*>4AL4(El6uA)g!H=^z1I7p9Z8Eq4`NK;@woZ z3uz;zZAhCaZ9>|dU$2=04ZDZFEycGjl)8|%QksdhjnYJ<`zUoFZKu?{3mdkBVjT*1 zQaXUMiY`ifkaknriSz`etw{YU8V60-h`2|Efz}}HrPPhIFP{(SQ;n`fK0rtFX;x*s zPsy)O9IG*H60@%E&ImiSkggr>cV2hP}+(#R-`I+ zuy8)?3?&)^0bg7=(F7XZEW~_?BKqVQS22GMHFc7R)jo1htIJiUexI^Ym;x@O`TAKj zkMmcMVF@fbu)e7@!$f!sOF}25cBGk<8jnJTl+CXVB(%qD1B5kBJt{&Z66U7b`Zl=_PbPuINXoM}4_91Ph)Q_}HMfobG3-LY` z2HJ+SoziBc9hBA~?Zl2$zi)y@k3OzdSRr)e-4O6~K`b=vZW_M|jr9bjZlr!n3y}7R zyuiVB^XE{n>s9wE>1p2Zka^#3$hV z4~4PlRhdX7_y&;5^ClqGQEEe~r__MdKyTP0 zEk$ahv=FJsPH`$?2c@w{V<@#CjipqFG>+2#r$n6-C_V8M_NqjR_n~kSrADO8bzy3izOjLm>_#4Iy){fPk+E zVqsq^rt#fE%;%=G5NQdesYpvHjYV1(rZ~pi5Lbk;Fn1HuDp6eZ7~d{lK<{jZfUgE( zVR38Et5|1auphTVz*iTRY@j(c2r=JoO3RQoQd)$xiPBu8&0&iDI1%xlFcuZFBWKx`+p;>cORwQNZUD8_2V|g9aOjxX(y#MNV_O4LE24eA<`3+I+1$(6el9? zp)>|*FQrzbeUuuJDwIk{`zalG#v>FoKymLgf}W+c8|fgW?MR0xZ9yu*SHe{;xDlyN zMfs|(7O`H1ftDfV-zrxnQH<0`X#r9brB0+~O5>1PkcL-vR>W2+tVe32bO3uC|CYY0 zXnv%QP26qF#(8e-v%!w#hJY^yB48JcrBQQ*m@jTq{bTbrrlbV=){JixDIG+MPolI3 zX$lr1ID`Lfun>K`5UCIW3*n?uJ29I~O7|em6$z@&pj$$T?uLLbFPvxrjb0J-i)6|p;v1x-L&La763DWw*qWuj(kH(%om>Z=q2z6ywi`l_Pw zT|&%PLun?`T1u0U)=_Fl+7PCfUgB&VTD_1{3IdfYopYLbRVTgr0tXrH1mvn9bt;@zZ-F97>f$GAnl^G7HK!7 zB}h+DT8Pw7X%f;NPF3#Tfw-3nn~?TVI`lhH4~5cxr2Uk3BORc$6{+Ve#SMrDDJ?}h zL}?yU>1N`E5|HXBwIJ0~I`llce*?wJ^P+Y}N>3m)QMwPQnbKyY7D{W8T2++0|5C&@ z6$V;})J~}rse{ruq%oA*kj7GKKpKZMeCRm%oTzgG74AivNNE?+BuZP6rcm05G?mgS zq|Tc?r0v{@GpTSM(p*ZDkmgb9Kw3bl327mvLrvq19_WoOiu(WqEuypwX)&d(NZpj~ zMp{B?71B~dJ+5NJWdytOkXBHdgtUrM2hti!%}8r0m5|njXc}I>Qi6^+gpqa!{V=6% zNE<2LjkM`zKKP3Z95?~kC;TAH!J8o9YlcYZTKCZCHRvu|M0B-lmj1w71LF6;0P$PH z@!M#8KfHxT+ec{!(soK)kakeI8);{lqHC@~+!e;cHM@~^Q(A!Z1f{7+{glQb?V;3$ zw3pMYkxf%0;yx-oggR3wRgm^mdIITy(C;Nimx-%2w54(OX0cI-4VD{Hcmf1`gOCh1 z*bq(7F2sD&Exf(4!Emy*FBHF#$JgBwim!)|YO+{`@ePy~BQ=UtRg*2#AA?pfvVx(Q1s-~v7h`Xt964DctI*|G)H6!hzR6^QIX@85*gr|?< z6NnW`+mZHD+KhC7(mJGPDJ?}hNU5s@r=~*`J5g9FB;64 zacBsO1zGqX&D3XMb?WzV=f7`JzfU;-eW&_;;<@kZZy2kIME`k~3-T#S4+MNkLXux` zPZ1?mds@rhprjrGzSOX!QzeQ1v!XR9>4JbSGc1`4A(j736=J?TN@I`~P-;S2Na>&` zlFt>U*zNs@i^5oR`!=M-lF)j8_z3MW+<-&o>x;i zuVyS&jH`$Xge-QCcuy?0O#Qy4P<4>+4<+5nlWq+s-A0SnCd7REC~ZdCPH6+u4plYK z^lD!Xs>}@mUuQV4E*d{qi21rHO+b2rQY%tFr3R!uVTz`A_7$GLuQ!Z^>GdM*qqGyL zLTL-qeo7mV4p3T#^em^U5yypikP17I4pAD1RN73srUj{vQVFS^(gAD>tzk3wZPQ|0 zd$?*smSP0qb9`He`n_qh>YTsfwP5R&LBMAgQMog+&>Rben9oXSDpDJzF-Yx{8j(7} zG}wA=qV;0JShSuWX)LAtkj7EkgfxND8l;JomLN^yRCQrK6>$m`b|6iq)Qr?gsSar- zr3zYXu4twi;t(49OzG=Et>;0&mj|)XAr;X02|~{u%>F$tZ6_;!d zOYWg%atSeC3#BPYTScm>MX7UNu%HeI_}apW?xWESLd@4rX+I{~L1`D#PD=M6?Ls=H z;$;16Q#51wmt;^6HKBsIc|p2C46W}3>cQx0;sT+@^kZXT)Xq@UHXgMn9JN=aLXT+H zytjh2O@e^0FD$8GsX~_n9YW04PpJv%0Hs53@+5s{DeXf#7^di0x)2YAu`uygq|&X# z_wGijqqG94p3)+u21+xL8aY)tmITBmDr`e)rqqDcLg`tdaG#Y@KT_MR-2cxo@xS8X za&w)98qI#IYKx{-Xp>KWAmDRAQrO-xG|?JVdaOuvveDJ4PB0D=#I{X%JJ_~%2>24h z2`176O+w6E{LORyDH!^6Gfuo7i7 zew7gORZ!|iT19Ct(i%$Rkk*DN_8lwYx-b@%&?9Z2RC$M&)wi3{PNa>Lwjgbyv;k=| zr>ZGc72-WqxEN^*rI|=uDNR7yMyVC)K1wB|o_31+_KVteP}+gClhQp%yC|(g+D&OG z(i4;x?)Ql7{1m66a1W)iNP8)@BJHD8k5r*_Q1lgFzlw@`|A+@v7#8t0RA zf^js#S|R33ptKliBBf5GNtDJQO+gy+s3UU&)4^at20_r53Sw9@r%DGn2=s>}yCLAq z3`^$H3|obmFOSmQNDC;fKw3y?AyQYE;^nRs#6@8&oKy_bVo_YY+=WxR)I-6F#X`X6 zhFDm!5*ptk#C)Zc>X4R+RK=7Ir$Z&7L<@PM72!myRNBIgg@KTypG($+C2MI$?Ly2~ zM`<(C21;v@?iP8$wNt}km31|$t*gH?Sa&}Jd`;oZn`wd_Ld>^^(iWsGllMVK-x}eD$)*0gN}h^yyg-w7(LAoWvv0%;GW z?MQnm-Gj7`(gvg+h2jdt{gf6X9iTK1=~+rskPcEBi*$%m>*3L&&XS8eFzgN3dE1W! zEuskmKAkJn8}txT?H5)FF`t3bVx&e&bCH@TO+;!AQ=BH*5nIAoScD0wl~M_*O;kd? zigp|gR>A@SpB-Xhmv+$j1|jB)p>zmSjiqz|X&j}!NE5liquJI0n$uL6Ora3RXcJlNa}k*ecpw* zh6+28)>4{?w2smkqz#msk?y8cLh5Oxc%VyYqKVR8q|KCeBi%!3JJJ?PTadO=+SrA2 z$To^=QFtGvWk}m8Ek@cwX#vtsN}Wi%RFuyl6A^c-FwhvJCn&Wd^;2p<+C%B!F`>&| zO8b!ZAq~$VyAdl?cpuV!N}G`mP+EudETv^g2Pt(S9dg}8T&NSVbUUGONOhE2k?JWm zAT>}ri2dJqJ9q8k93SU71EM>^O!5Q-d?tv5{oYKY@55eep|lC9_4azr290TvjlM0$ zw{}W%kvc>{X5+lbay;mK^bqjHKm;sAtPoNkaixYNW4UBpSTf-}$&!#{0hde+OD3r# z(e({>2XpU(fG;I1nF=A*;MOI?d`?PRk!Di58)+`36-e{K6kT5t;({<1t}hj7A*Bwa zE=u)Cizw|A8t@fUx(}(FQ`KQu9pVz9ovEtBFvt5r?HC~7D}`v-Hf1V3Vk;JgBvZL$ zMOd;*C5akWJ`Seohk&mpELqD7HF7}LA;f%jl(rykptKR`Zb~bVHiju`+=aL)jD^OX zNSi55K)Q!g8`2g^^+;PO9r%dX*4M_VYOwJm-baPok+xIXg0zFuMx>pTRw3=8v>2(U zo8nx=Cn!xs>ZjC(w1-kX(q2mYPl!7AQQC6?2OEXrP89B^v=!+9rHx3>Qd)y_kkS&Q zLn_J#n?l6W7Gi8pq&i9ykm@P5BQ;QJLTaQ`LTW-99&GwQ6bdp^VLws}r5#AEl(rzX zQMwzcozg0#jxFb0h(#Pjg$t0zQksf1j?y@!36$E9CQ@ny$}hwwQ9Sg4&_oKQ3er?c zyOBC6Z9|$#X(Q5HLOrf3#CZg}ijfvjnv1lM(nO>#O6^FCC^aH24p9$YeH|38(&r9g zq`gQ>DD6aAN@)wyGD;heR!~}ov|vpI zPYg*qxMW>evf(_*!jPnsOYRO!Hl8P08bikBG_-L3?S&CL!kQqjWI9Bl{Fedyw{1+JST+ zOmP6+gZOM1ivhF_=^&-0NQWpbL@M1ube)1!M`;XFJ*TSEG81A06&}PUFjCrs)I@1J zQZuDZNG*5pE-)igoR+z`CPPhS1^IKDszm+XcK-Vs^?UmrqA76#-Y?pSPrxDIbBL(C zDPw4%_6adxETv6Ioly$%At#BfGQG|37f=1ZZp7-=e{ zPNYssV~}QsDQYPjOQher;Tzf4{J%uj>mPk?~00+PY< zSJ4D*Ld;h~sR3y%rDw6Eb(HoXZ3t6TbO++yqNKrnrvA@^WjX-?Un9i8GBt(cib}Q$ zF<&#Kbx8M6T8gxV(n6%IVTukT6>(b_i|k^N?xWO#w4G8N(hf>{KI8TBbyC`jw2M>K zjJpDHHx(BfDpYuLCxQP2Deu~r?c_LXPqFxjc6q6FF27$dwcgy(5-rOXbXF)?O7?{5R~5SX#E2z&$Ij^!ydQBbIRhcQO3>iXLY4 zj#x$w+<${lyJ|-)0|w;3B0UzvWM#jV*#5Fq;IE8JmGVUWr)Qg*@K;Zk)(2%Z6c8Yd zmABV#z@L;RpdkoY(1H>oWJEy3zhEG?h7bvq5FyhBC!QlU7kQzC2$`kjPW^$^K`#qh zkfk`zw{+@R_@#N}{JECSnp?ordw^7X^Z1f?yFC={a2m4BtuIe9emM&xE`BvjP8b;V z)&&Vbc$`Wj%;?AQccYYg8qB4^gCy6G96|C^koe{EkmZpf%W=AGZ7}>AGL_}DwNj#O zA@rya+Nl=>(G3e)kgHUl^8o(Yn(OEH_Ju9`t&PqbsNyg7xu{?4-_(dC3v0#A^qAaJW@iaA;rf#JvceJV7 zLZ&(zzl23oLnD^zYY0%vXs9g><CT zbE*hX_E7caXis;9G@bf_peIx@a+URjw~2<|8G(Cl#orAK=04fVa^jETPn0Q@xT~26 zp8gd`Q^UF|q#md54{F!fkg1eW`4uXUrt;lXULLJ{Pe|FRAA)kJ>_8T@AX~|x`n^<7 zp}Io#+ekV|-b->g$x~-QP9m8_vXSI{Bzu4~l~-Arc6cIwcd!gHr5-5#0{#S-vWED{ z#Q&4zLXuNR9ws@J2Qz;|*!)Wv)Wt#hL}bm~o;!WE8OC7bZu09TT6S2L4#hLg0BoJBH=T3v4)6BEKfwYzJ>^8EmfN{0n2e$vkW}_kKdSp@QAF1EF~%OB{*8jju=Ax zL@1TCv<0e)LQBhOX&uQDlFyKQ(L*|$^s}U&l8(Z&l)r%&Eb;|g!(~XWl1$@wN_aSP zR)pYj`ZGazeGQq4gXrGT=;w&Wc78o3i?0Xa2%T)@)NjByi^e}6vhLK^ZVLxPu5y_0 zZ~hh4P+kbZe8;HAE>RT@_MA=O0WHa*SMMBH>^E z8kGgBBk-(XnovQ>RdNY`h)$-kEQ07kgijo@%M1KlB=Bm7w|D=yrpJM2p*^VcNp+`$y5## z{nbfS=smcrc@;o?2S`)Pc`c-zq{tU&zV;x{;M+6784V%IdYV$DZn$>89?_LA*D#F> zB56d<5}~Z1s+&>FWfW_{(+5OH@kYo}obDO2Gn58$l`?9#p|+daZ&KS9t^HO=8^do< z8Tm`Dl11&W{uxyX)p#lTqXHmEj>>CW#AP%y}b>lu8}Q4rhdmwbOmE}}VqIxCOH&DGrw0dpX zvimV(sU=(?{LqQ0lx_@}?`XVG!vboI6i|H)0g9WNtD&i6(NP^8JuMA|<9t74$f`y`4M>Z=1l=Q%LS5`60>nB-fMNO!88aD@bl3 zdF~gcF}#$i53l?>8ZV$QktsO$9d4ub&{7saUvGe_Qcg<^wDgX&6i(z;@Pd7NQ<)6~@@&-@eQ z4w4;79w51sq=V!xlDkO$c^u?AlDkQsIPL+xl=MfWzoU32$&X3yC0Rmp56K3S*(5(9 z`3^}J$xlhHBIzLc8Ofy}z1!161HxYLWd6kIR|oT_z6MO}JRCoPMBOdn;ojl%5Io6v zS%&2@I+7o#=0qrashUd1n{Ze21sx}mTto6pk}ag+aEsd)GK?(+#-X)*(AvyHuCkcM z4jqeX1Yd>V*yGq8>RQNDW)QtD8vS($jY;pGa3vsD8B6$_X!tiFxF^XtThCOc;|y$M zD}WFsi@JlMtGIAi(+Hk^qcjz+e*TcDIDJ;obA1h&ii66{seI}eD1S@kKk(Q2l*1(V zlRVaibUo<CHb0l@FQ9spBvf zE79Rv^&rl``U!>9~ZBkAbJR zBAG?d^k%_hVa-0 z3F7N($W%@p1A0E49mZYFui)u3NbVx}FOv64Tj3n~Eo2LmyuIP(L$0#!Sj+32dS9w9 zrur$Wr;?mW@^_L+(bi6vX}?yW+McHV1fcX^egZz5_b);iv&d8&wDlsDPyGz#KdAhaR1P=Cb0KA??pYJmMolAIISeKJPKgia;`s=^E(k}i zldJ3^yjL{*&k#IL|0o zlkhcwD-&^7W0{PkKSMHyq?P33BvVKVl8<^wJ4nZnE+cs=0MbTs9LWPDV@ZxAxt(M) zlKn}pC3y+Sbdrln+DUc=Y1%z%4qmXp?g@rnU(MrntxqNvfbaE9ZjZL8T`F}wBa%$(1JWTQmk~fpwOVV>C>7JxFl1?G%BDs>}RU{KY znl_cL22Z-~XdLF@7!y3m!@;Y*h5%(D)b;&GU}y#nrP9zIkf!F42A)S+!qToWI3aDs zk(uDs1SLs`GMc8Il)B-v=m9}6{r~odYZkO(E6s)rB5 zv4f8Lf~S8@^5jvFnIyN8^z0>_MfzRR8%g#fxtin(k~fijn&e!P{YlOvsgTSjIh|w) z$pIu4k~t)ACV4B#bdm!}-U8CQJxz949;c-y2h3nyN{_T9a+P=}=^d$l9#6Py22tH1 z)x+g9IHcWCk;i+OA!8#MQeQ)WascZ37vI6qE*cs_L)$=lOzmN4$Pzm9U>wL!a+UQ| zUrP1mR3Aq5Dv&1aTSD4N#xWhnQ5lH?^@Rv!E-l?cOJ%f_Gn}R}qfO<8OvUM+hie3x z%2;Z*kmzuY7%_R72OZf6%5x|`bO_edX?-M(e?~Hiv>yr9JD%Y%5i_jWK?WOi9L*>F{}j(E!A016x>I8K=t@QV2WBRNSm8p;Z2T?6J5r zo%|RrVXG!YbF&QY#L4m?98Z_6At!XUL76O%u^Goh4@)c@ZO6^3vaqA6QrUQg!+5pT z{bw+w4BV_L4lwEjfH z>SC#H{8)^ke>|kWkNQi)`pcvBHyQdXO!`LlkG&8~YZh)+tqkk0j@D0-uvKfKxfX-F zR$A@C?4LnSDErr$vwxk$@^Bw+R;>>^+9;LH*`M4L49Sk0Rhz=d`e^5;4CmXUxrYtz zu4wKqgS$uiGG~8z$k%B4+8g$@FIvBsgso~cWuH;0R)+K!QvX0$|F9`l2C^}P+(_in zFj6-mjUvgl#2GCj4L7Tfhmj|vV@i~;Ri~o4XQZ1|XQWlrZ}rTy28}AXS#>^a)N;|w zT@tp+7R~KtaP86DB!laS=GqOeGt4!P*Bv*ajSsWs@w&YRH!+&K-ry!hb5|JLi7dNZYfH3--^k@s~jb!wS<}Nk38B=6`!yh>fwjvSC z-5lJk$_g9Jj#f{RuvIzHT!+COda=<>A)~8lG&gM29j(6DP#+!5EjPF&5u-*m)I&xa zX>@GZ=mZHgnxRMj-ceahFij=6Sv4_?yy$hnYzbRc7VX|;aHmFdod&l&ntR>|b%wzW z9X{74%(r$(Sq`Sfm*a9&w0?1g1XRS9USB_MThrcSEt(RR;$)M%DPj2(t!BP;jz^*k zii{Ia6%J!C_<9xDA#I1zMd9~d!1VT$8WoPJ`U?BI)&*l-mmO=qBgb`_<#F696Pv|3 z^&c-_K+MHmO&%JJ{xwL`IGzt)g?(;42F3m5o{q*)$5C;#Y+=C%>qIHNXl=Pv50AzL zW_6rY!lUcpQxZy)M5^2stuhmFhdm|*lL&{(;*5v@PVtlvlZAEV+) z)!M;BxT4d}M?6~Ah`XBE;OQTLG-ZUxY!=I-NJ=PC>S)*T>8z;&eMsJQ%AQ3Y4j|5KjZSG~lIySdtke=aM|lV_-=nt4RJN zkAa032=k_3tsc&7r+zk)s(Ex^p@a2OC!DJJ5QJ5dg0&6hvo2C0kV2xAqc*5lM5`|_ ztM^el{EuN%mJjjDUK(o8q}1cC#s{8$sk9rO_&#p7i(`F}lu)9qp@na72F$eCsYa{x z31%*$r$kvym5kNVIt$G@eU$$(JTm&530J1l(9mc*)n+?=mH#n#!cL+GGjD1r6KLw# zA5qCzWH#m0J4KQ~iQ=Zp#%Pr%%qns65ROr;C{Qw}G0&_q$x^e}tb*j=s8O&bQ=%kO zr@*XZsd+M5r7Ea`{G~*(Q6)KA<*6y!h-zy)&r<}PL~p8};6bl_xT{$Lp8g%l^(2>) z+)Hvf$)`y+fHbXtmw^|qs(qFJJ~YUgxP9*a3fuMd$HY48vV~SV^PC2hN`^5}S`Ie? z&1~7JZ-^v~60Q$!HP!}dj?3mfW1Ahj(S{?%s;$bA*UD-75o5}G?)ILs#=X!mtott2 zR-GIKXpReZ1UiD~Ke14rm&=n@oP=bzM2T+bH(G6sLUfo23tR~Pff_4I=mbntWf5yf= z_8XHv)8*VaHWXW|DYzdOTe~>iA<0R#$%y&#Cz0%1%CsR*S}$)ilulCbjf6YAO!GWx zZFfzY^llR5O7H0wi+83A!^>l_0=~;#&YoXvbhXvCKWQC!Pds%ND-mNOs8a-;NZPlw zK+JVEBJVaKM-rJvWHRCDwNLtfk<7lVCJW^rneO z8rm=o%ZVIhLKYHvS+uj(M9w9$qX}75rab{?eP>Yc>)nxr6w^fQHAZpR;vT!QnXDJi zEmMK)d0PE@>YvqrgGr0_>uyxk-YDU+GAohJMfBYAK~nf5tM+_Rp7w@iXNX`+HAE~+joiL5dqClWb4+L@E_ zE+le{33*qUHfkB1&7|Nuli+Te_;+fQGnwQvA}=u^?;-LNA|nkUp3X)SdGO9i%9Jwg z6FBRaOToJ)!M!x`@PBZYMWoM!oK&WD)ex_Xg7GH7eKc`7O+@O0Y)eiedz+ADM4r1k zDrGWr&bI;bG81xgnf3ym9jD;?J0c00LKCmh#6`{;iL5mt?oyZ>1&Sd5!64}p$ zoKdDteg>Iir=X2V@GwpIQ=(EPGv`ceAOjO3DZ?r02AIe=PQezF;8B{Wf(edO7$bi~ zaxq{!w;TmB*fDbamfhmz&!Su02Z8JsN0`jaEYrq4ix4-_es_~#7VQVF{A-r3A@c0_ zNQkrX+7wJ=ETG^slfXk0Ps0R5MBn`?TA~cG63B}~O!yl@WS1*L9A`39S*DHn8$y(W zX-|`24(*@4A}U1L*rzg*<|gE0W!j4{agXd}zblQz?xl&BXd==J$ci(TCf+k4=Mwp7 zv@=;ha*0$;$f`1}%L+Klpx}0sU>;3e8SP9~oMa+zG$H2``RCH6a%fdB7E}Cnqlp)|2{HaoT5ZSd+Amp0jrKtcRYg z9Bal#lKBL6r$E<~%;s$QYv^UR3Avca93mrq1n1OsD~TL!LOw}k2O>@BZgm$>*P2jI z5%qibD9;ESqZRGNnvhF~{FumyXIYx%MD8CGNzKwS?X%}mbtX{own^|bO-zq=CNtAb z-LcV}@1!w)%QSig9k(BX3cHmW-h@?#R7%PaZGa+9@ zyJEZxD0spo;OXi>Ax%W;gRHYNiM-2%Tt#H+e{iM{nQ20iRr*M z$x+T^<;x=Sr;;BJ@;IB%SXN`aYrIbZ(Iip^V6nOvrcff*VqBkDP)@pn)caMLWBc-6SUz*6KV%hGowAr z^vl)HLKAXlnb!Fg1fN73cbEh`%pFLHa%8kkCy^N@{C3AqP9IDiz~bE*YQEH()~p^2hsZ!!}O z6M44@`6-cU(avP=vWv(p6Y?``Gp#{(ZKR;JNwAkD8rw%Dtu3p|N+R{VNXkAZ@=YQm zDT^$=Hk*)N5IL8~$iOEX=wc6zE;T{FB=oi@_jQ#7-ERWzBdB+@=g2Z@kO}z}k(Wh# zHhM0aTfbL)=5;*^!YD4`Bfb6Zh0p@R>>Q9Zft<6Oo!FJ7c+3@RAA1WAlOg zqMgaP%Uare)P(%LOuKfiwO!0=N1XOuowb{GAE+_Q0h38rt#cRfmgx{RxsU{yM=Crd~#{y-n6!FmlT3_GC}n+ts2mN4hZ$%hDY26=(Y|WqNxhVAxG|J>^32P zF4Mk;iH!4?!NdzD!7-Y+3nmyjno`GR!CHC-$mm*{s11D!4M~SU7G)2Und8{td!P(c%sS{jQAVC?BvnUE)m z93JgV_J3<>bBqc3E0JA^3=b@ID+s#bMic5^M4d-pYw|36HMv9WFd=^{)1F_4;1|%w zkztWkouY{~G!b@W%y*^|xzU9DoyghI&SYUuByy1n$=3%0qlt`k^GJ%N&YeZ*L=*Ji zgkJq0+-DHk*MvM%rcHetorK(9cA5ldY2s@n+vF`Wlm5rhNLu;YL0~PBk+jO}a?#l) z6Y^Y{b^^{ka)0?LlYs9R1WKZvA$sie(}ZF|^4)^KHPOywCY-+%$eT>a3q;z8jMN`F ziO{nMjWljw5mQ>_fY(Um&qE?>;2Q^lc{CC6Ci~R2L@qNS z`7%OaY_v0(u}g_8Ga+LpYd5{i?4sailfXt3_Go7^yGC<*lxRZoU53CR^sc6q$-cIX zHct$Wq>QgQ1lAK7DMfg&)Q$BJy4?ijD-eOl2@R*UE|;JeOdvZ!cSU=a1tlL+RhW=` zT_TVf?O7I725k->?1%(;>11vEdSt)c`R!`5!Pg@KKcUP_>6AI*qK$tKikNT^`5}=P zr8Az$PfW-bleL3z*6)0C2v(T{e6u2OZ?rR+RmX{Z*o2J3`Th6M+aGNn+;O{Qi?vJp z*t$jlWoLSs3GAG#y#R3W9$NW6ClWH>%?P}L9?g_Exv^1CWUUF=n#fr|1}7gr6rdcG zHiiPYYJ;^?yR{+rBTTw&CTrt1SleB-f=0WW1o1Q)K<`bXvB6PpDGbVSehYN^R)!3I zI4}}6UkeF%gL*L!-X#N>31o15F-_G{YONh^Di0aSGa2E_B!PAz=W&m%!!tQ)sO&!& zO3*tbJ08(sV^W<@)bJ&k-`R&7FdnXGlHL*~fU-JK>uGEH0+?MznnQ+7D(V?yFp zl?Py=Sf?P)B;b20fv@a{H`3tH*e!L9ME;l^Nf}>Z3A_%ZtY~qMp`3zzlYpJ|Hz7@l`rB1))E;>tK4QzPl4xhL?^!_;iV4a0cmmf%JCkKCkIvj=Lh==#fQ`sVPa;ckK^Be1 zo1lFCC-7}dR9a=u&LHyV%t%_ZF{9gzerqBH^(Fz|5em$siHJAkKPE&(E;Awd`cPmj zkik*67AVmFDJEUMYZN#kq5_reHiKR+^o<0XL*#ZMBZVTTNiHJy znUH(|Dex?i<^elNAehjIozTx-=Lm%}#iYvDkOIAes(7~C6}K`eHlTy!_ORg7?}~bi zwc-7hKl?;N9Wq&aqaMS_DV`(#(j*v4^Uq*M#FPfP*wKl6)r1^2S+h2v7Vo3LV-oQF zq`)AWh_o4*VY`SdG$HxYQlMkBGg+}V5}9g3=1$f;aMpJn1y+-QuPX(1qBw&kyFOI1 zYk<6X8k3;?*kJ8?*K&wtF;{1Va^#Yge8=fnktt-^y)U4@yG<~@`*iGDQ|8F-b|zu{ zO)&Rl?Y^zn9Fd2&Ew)-mhy(4GZLsAod$^_zh@4ypA|K{X5 z$E1AI6zZp55pz5R9=Pj@XwMk@St~~RkSzRlT0P@ zUK4W86m7r`?4V4bpub7Lliq<3(HWs?IMGtr{&Ao&aicti!Mro(x3U;s+F|WhC~fcU z8A%Bbh6hF(JzprzvYXAJvzJXso*56gfb4@KlW~u+7m&W{TcJQYYkhZGySK@pQeTr& z)f8>&PV~(#3Y;bZ&yWWe89m!yi|!xSMn40xac84&SS7ta)SHi3A)JFo&E zBfqk^2a8^Oivz%(r&G_E&o&6W`YUH6W)O(L`ISrS?C|THWc3_D|u}DSea}u4~~<8VO=cC!`Ns=Nw_=< z7|DE-7Ef*;vs24ryzW`W-?AKEI?g!DUD@wN04x;_z1y~?rX8`QtfrIP6JJDVmPt)Y z>K?qaGtqZBN$>H|MR^pN@ z6RAYD_QuE7_8$G96|aFCVxSKn23l_)=L|dsn6ejl&OWO4q9v6}wuS^WF4Q`@A+KsSYJc`&(8+Bf zWv%kF-6**nH~GgU-+|P#3%2L0qh007%%gVtP0LdpP|sKF9(=i9bTW^QqCvTL%ylh5 z!iApv$OZiDvmFAwq2q4)npgcYFma>qYD$QQ#I67Fuw;bf$IK*Ai9o?$7G8*&U~Njs zHAovtlmW>86eputCN%M%M5wv0lG2Gjj_(%l_6gh6rdtkJop<8%Fg{P<^AbKE;Pd$b z?Xgd+>9@lylUT=l~Y#VE)Xl*{Vc5{toC7bO~ugRS4e5hGdf~1=j6c#hrQ;_R= z)okt7Ppwyq^UJlzKDDMLZ*D*?THM7D4V;79k} zUU6?-st$It|JCkK- zm5#fguJg#i$3x`TEp1(eM@AU`TB&{&=*+&$enbXTmRw(q-bZ{TRW;9+4%jKJXGsMecT(`oX@RUV(bxZ%jec4 zejohY+J)a2f^^as2EXqY*1oM}g(`O?vx!c!=IKM9)#iO+P3`};XJLG<%Z{M%CVeJc zKKLbqNXysfXtJ|Tck4ebvsenzuQ88uTxr0K&)int+^rvdSv&cKwVn9*Wv%&_nC+P} z^CYvf;#Ae?iot)$$>Ly6J~{0#m29@b3N@(f>&KUlQGXnVY@B3K(hpgk_?m$-(|>G` zRlqmsJYJ7WEWn;rYCL z{T#+vbymDO2zB}lSd)+#{BJhNUhIZ=({6|doq=(8o__5cAVxUwD>#!Z`ppkqXezEA z(Wo}+(`}lz&ziylZrEq-;*kY9;;349MjZqnZawoGD$;z<(?vxv``Q+h*~xFAG()kT z+)U`HykMCQI*K2@%iO^dU9npBOKM?bzOUk_uR`}#9M|U?%<-k@J&dy0vqu~MmGx3F zY>#%|SJtas91vRNd+YyXca<0!B>EkI1Xa$doav}-{L0$Na|$_{-}DVK3NN5lwM4ap zhEq8SwmZ!J4ZWt+Iu3STn0tlbOdEM|>NM0LE~Fq^Mm^Q6TR95^dY#&7(qaaWL~cf8ok^&ZS+ z-q~e$8WWqyj3!4}eZa{gv2mgz3nvLF{4-Ccf7-QvYq!hBpv@E%>#HBeX^XLb>yWOEAN@5X zdy)F{y^} z{N4JX$X`&KcG`MHtVl}IMxV1jfbZI!=d4%92-Q>j+XZWqy|XO|)1Vf1UK1R+`kKAy z+9E!ww#OynWn1%-PQuybs!s2u9k@)~B8ncYO>u}s>lL4N6i!!?aQ4DyFg_*t z%)sXvd|tulcgQWBw7Xk~A!5}7wQsc$$E~8(n%d{$M4MPKwT<>pyqGU0xN0*KM734a zx2gT8t*95GF-cq4Ui{enFd`|B-MA;I_K^;vuT8AHwRS^ivC7)v`dit8Q?_ly;A6qm zr5ESGJ@@DxZq=qGi-v@uu)(!?O)=%iJqiBjS0RC_p0++#%sXv3}%bxFQknpx&-p9`(^TpiQSLYKHXcqZWCplw43{iQDR{yZAo8oFX;u~ki)fVgd?Y5~28+kJnoK2GBP!sAqX$@K8J8>Xe ztLZ1Q#N1KZ;eMi8{E)5Pf0I}&X7$&s{l(3qPk(Jte=(}<7bAr80zTj4b24~;VTATt zfAN7hnO}QPHVRdo$f{jDKuoo^ywxq7!}El5B|hWxwUz@#k85OTEf|`bz`%A6=E~H9 z#vr3(W027mVUCRG?j0zWiU~!vO#{UPqVt2Jh4Wc_el0LQRk&Y_kI_-oUNb@nt4D3{ z>wc&Igx~G-yOaIybido?cf0)VUVgXT?@si)GyHCc-<{-lr}=mL-SK{Rir<~(cW0Aw z``r`#?x}uvj^91e?=JVdhx*+me)kN&JJ;_X>n|zuyGQ%oir+ocznC?_znGQ7znF^= z|MGPAa*ZOOMX^VKj3N@vRACsSyp(Bae4N1$@YkTE+{d5} z?G6XWfP8au5w{U(ut3gc*5-g$er46^a!+fleExp?&nBPb$=p}I$I7%RVFgBE6PJlJ z3=Rz&^v{XMJ-YCCKT;aEq4j~?s;o31ZOBWzzutR1xzWdpd1#yeqsBSCaOa<6C;hR1 zPGa+`aPyJ>qeBgib27j*>Le1A(zu`!iBYYp+t%2EWvKmFB)WRWBJY!2O2RGlhnL^*@x$?RI zSN%cips&GSO0kWP>|8{Cgur{;UQmdZdRBdlYJJ|KiRxO~3-2S8I@D%pKhDh3$ld~M zs?7?qqQ-PMIiH&d(CAt3n?DubzWJNvwH{YaA23_@gt{DL@vgsQF{23PvQxeA0iPG5 zv-tjOQ`4NC?8dyutPh{?>ph$N%WSYY$>u*%{XApzFN>E~m%R3pSJqMgvJ`pEkXHxu z-@hzL5?S)I(&~heUHW~7Sy6@S>C8p$ym!+^e2$^Ab&Ls zV4j>T^q(Kc(hWqCzp65#qT;IE z<(I2Vn5Jqk)8tmYL-CcbE@5ij`Ff}77z=*$M==xtcc@-^bnACQVyGHA)hZ3-sVX%w zO-4tbq(8qfhN~<`^}8$}R*kVZBjv&Odw7(rsx+0S?(%tM23ct`I3~*7e~gL0oJMj_ zs$M46G&W+0Y0zUzeO~4=hsIEq!hq{UC02j+&tq*sFOiP^!=)yoQ=7K}98jL*RN378 z_39$pZCqr-wYYloLVRJ{=+HKAgWdm;Z!9{nd9ohOvqOTuZXT;eu&bLV>yv(9D|*C5 z6TtV!ZpWPFK!bnx!LcrRz4fw)G`_vqG~U?etfkO0#0nY$i} z_n%Pr=Ap0q{O6dx`Ka}u;|a1l#F;w8p}xsT5nQJJU}#Tolmm%z`jcL*w!MnGcyGPU zpBT5{OY~>1xDBISSHp$N7_%UX+wd7jP+zXg<035Al}b4z#5eBdO|C12MoP}$O5u2n zQzd86H@f^K=iws7pNMOkzr^O9$9U|rK|9U;I4WDP6Pdprh}8M(a8;jRNmtjd#e+_+O;AXx3eT?r<*@j=n_mHGrrItCSAEpqrA&zhkF z|B6cdE6Te~1aY2_Ie=g>3Ff@>=`)5M6o(l93B~EguV(%C!RT2`UbfmpgAvOitT7hD z7niFF;Utle&U%-!Op#R4v+BWa5 zrk-E?`&aK7*R;b+Zg;imI2yU9tTxuzw!EDf*_~Wo&q{4((LQdpb`;NFsp*Z@6wiMF zb^=g#90e*8#MM+hXC6-VComNcbvAMif*t+LhH@@}9eyEO z&-u)Tic`cuZf7*9TT%05?o~UgkRz7VU#se8x5&%S!?vNqt)T5rbl%&pq4TOQ9=e={ zg8@WB|Ba#Ff^e$7m>yshOHMp^dD1X+@ZRl7Mo8%Quu}mQOg#SKYPRHsSU{@uW^_$Y*S;79iuDb9~SrM9kh8}?9=iFo@e?KeS@9q zPT72oIVE%3!K66U9qMOQr_tGPf-8pl+j|>qcrb9P+E$B+a;Sv`YbDGsnN%@yVu3C5 zoAN8z$?QaygmNRTl`OX6y!>!(_@?kt2z~+9=mY=awl&=rs2zOmhX(zQ2{~S}Y2+22 zkIu>B3&w%^#)y9nE{t~$=JLq0b1=^_S*n`KbLLV}SpE9Srlv`F9P`K@STi~{ zB9D9{<9&l2%!kj^y;V&QwPupy{V~J*9lTp@=s8Y}sgB?1D?+^Cj;qk49>*kX!he{A zrD55s4s;Y1`|di49YtHu)5qGX!{bwTncC{V8cuYH`IkD&S=AIbw+V9=b-2?v;&|$C zhY4i#5Oq5rNV+6-SLSEaV)f}B#+;G)Yn<2fGZLom_*{Qq%J*h|J&m43%*o7OrwQ!k zS&H;NnEI*19lk-%9fOWzbNjek9Tbm`qq+dk3k#i?Z0sC#o;jq?MsBDh;=S9G^NQW- z$9hXt4#c!$5T5B2#seImPbDhnxpns+O@o_|Mj*n;0?BUeqlQ42n2%7eV$K?^>Ct3k z8b8Qc9e=vovA8GaOJ-#5l$}xa ztX;poH0@#JAL3C9k5~6&>wJh3MbF5Wv_*II0KjatE!b1D%loQ_nJ)NIfQx z9V~haR3_^*r#glPs|$DKryjy%u5ZpRnR1|gMg^E~0S9jN3@)h`is9o1`WSIsEp+4+ z=lcda^+Bvqa0d%9CyU&A)sm^BlRcr9$C;Hn(t(L1YQ!(c?CO;G)Ih_Z0@XH=m4Igf z3e-}kx-GQ<4X2K^HCXBcW*Ma(i1TvgtNtB@F2#E@ze1t^ffTfw1jGC`IS)Qk|B#{l2+!6jP8IzO0>VRpWOwTCMS1$TGi=}RX!t_t zeo>&FqtSxYKl#M+K3FYav&C|^*sbS60knH2~w*|5R%sRJZKw+D7 z329cSPH|wDATe`FWS5|20gB3nB?kIn6e=E#C+WAGS~7A@yOwz

cAHGZ916lCz_) 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 delta 4578 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 E0R9S4z5oCK diff --git a/dotnet/samples/opengl/OpenGL.cs b/dotnet/samples/opengl/OpenGL.cs index f84ce438..4df1c10f 100644 --- a/dotnet/samples/opengl/OpenGL.cs +++ b/dotnet/samples/opengl/OpenGL.cs @@ -70,11 +70,9 @@ namespace sample_opengl window.Clear(); // Draw background + window.SaveGLStates(); window.Draw(background); - - // Flush the window, to make sure that our OpenGL cube - // will be rendered on top of the background sprite - window.Flush(); + window.RestoreGLStates(); // Activate the window before using OpenGL commands. // This is useless here because we have only one window which is @@ -134,7 +132,9 @@ namespace sample_opengl Gl.glEnd(); // Draw some text on top of our OpenGL object + window.SaveGLStates(); window.Draw(text); + window.RestoreGLStates(); // Finally, display the rendered frame on screen window.Display(); diff --git a/dotnet/src/Graphics/RenderImage.cs b/dotnet/src/Graphics/RenderImage.cs index 73cdb246..68953c54 100644 --- a/dotnet/src/Graphics/RenderImage.cs +++ b/dotnet/src/Graphics/RenderImage.cs @@ -194,22 +194,22 @@ namespace SFML //////////////////////////////////////////////////////////// ///

- /// Make sure that what has been drawn so far is rendered. - /// - /// Use this function if you use OpenGL rendering commands, - /// and you want to make sure that things will appear on top - /// of all the SFML objects that have been drawn so far. - /// This is needed because SFML doesn't use immediate rendering, - /// it first accumulates drawables into a queue and - /// trigger the actual rendering afterwards. - /// - /// You don't need to call this function if you're not - /// dealing with OpenGL directly. + /// Save the current OpenGL render states and matrices /// //////////////////////////////////////////////////////////// - public void Flush() + public void SaveGLStates() { - sfRenderImage_Flush(This); + sfRenderImage_SaveGLStates(This); + } + + //////////////////////////////////////////////////////////// + /// + /// Restore the previously saved OpenGL render states and matrices + /// + //////////////////////////////////////////////////////////// + public void RestoreGLStates() + { + sfRenderImage_RestoreGLStates(This); } //////////////////////////////////////////////////////////// @@ -305,7 +305,10 @@ namespace SFML static extern bool sfRenderImage_SetActive(IntPtr This, bool Active); [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] - static extern bool sfRenderImage_Flush(IntPtr This); + static extern bool sfRenderImage_SaveGLStates(IntPtr This); + + [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] + static extern bool sfRenderImage_RestoreGLStates(IntPtr This); [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] static extern bool sfRenderImage_Display(IntPtr This); diff --git a/dotnet/src/Graphics/RenderTarget.cs b/dotnet/src/Graphics/RenderTarget.cs index f8fc9ce0..bcbfa489 100644 --- a/dotnet/src/Graphics/RenderTarget.cs +++ b/dotnet/src/Graphics/RenderTarget.cs @@ -108,20 +108,17 @@ namespace SFML //////////////////////////////////////////////////////////// /// - /// Make sure that what has been drawn so far is rendered. - /// - /// Use this function if you use OpenGL rendering commands, - /// and you want to make sure that things will appear on top - /// of all the SFML objects that have been drawn so far. - /// This is needed because SFML doesn't use immediate rendering, - /// it first accumulates drawables into a queue and - /// trigger the actual rendering afterwards. - /// - /// You don't need to call this function if you're not - /// dealing with OpenGL directly. + /// Save the current OpenGL render states and matrices /// //////////////////////////////////////////////////////////// - void Flush(); + void SaveGLStates(); + + //////////////////////////////////////////////////////////// + /// + /// Restore the previously saved OpenGL render states and matrices + /// + //////////////////////////////////////////////////////////// + void RestoreGLStates(); } } } diff --git a/dotnet/src/Graphics/RenderWindow.cs b/dotnet/src/Graphics/RenderWindow.cs index 632e5f2a..b4056604 100644 --- a/dotnet/src/Graphics/RenderWindow.cs +++ b/dotnet/src/Graphics/RenderWindow.cs @@ -407,22 +407,22 @@ namespace SFML //////////////////////////////////////////////////////////// /// - /// Make sure that what has been drawn so far is rendered. - /// - /// Use this function if you use OpenGL rendering commands, - /// and you want to make sure that things will appear on top - /// of all the SFML objects that have been drawn so far. - /// This is needed because SFML doesn't use immediate rendering, - /// it first accumulates drawables into a queue and - /// trigger the actual rendering afterwards. - /// - /// You don't need to call this function if you're not - /// dealing with OpenGL directly. + /// Save the current OpenGL render states and matrices /// //////////////////////////////////////////////////////////// - public void Flush() + public void SaveGLStates() { - sfRenderWindow_Flush(This); + sfRenderWindow_SaveGLStates(This); + } + + //////////////////////////////////////////////////////////// + /// + /// Restore the previously saved OpenGL render states and matrices + /// + //////////////////////////////////////////////////////////// + public void RestoreGLStates() + { + sfRenderWindow_RestoreGLStates(This); } //////////////////////////////////////////////////////////// @@ -563,7 +563,10 @@ namespace SFML static extern bool sfRenderWindow_SetActive(IntPtr This, bool Active); [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] - static extern bool sfRenderWindow_Flush(IntPtr This); + static extern bool sfRenderWindow_SaveGLStates(IntPtr This); + + [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] + static extern bool sfRenderWindow_RestoreGLStates(IntPtr This); [DllImport("csfml-graphics"), SuppressUnmanagedCodeSecurity] static extern void sfRenderWindow_SetFramerateLimit(IntPtr This, uint Limit); diff --git a/include/SFML/Graphics.hpp b/include/SFML/Graphics.hpp index 986fa7ac..d45e71ff 100644 --- a/include/SFML/Graphics.hpp +++ b/include/SFML/Graphics.hpp @@ -34,8 +34,8 @@ #include #include #include +#include #include -#include #include #include #include diff --git a/include/SFML/Graphics/Drawable.hpp b/include/SFML/Graphics/Drawable.hpp index 7140f803..210c7e2d 100644 --- a/include/SFML/Graphics/Drawable.hpp +++ b/include/SFML/Graphics/Drawable.hpp @@ -35,7 +35,7 @@ namespace sf { -class RenderQueue; +class Renderer; class RenderTarget; //////////////////////////////////////////////////////////// @@ -328,20 +328,20 @@ private : //////////////////////////////////////////////////////////// /// Draw the object into the specified render target /// - /// \param target : Target into which render the object - /// \param queue : Render queue to add the rendering commands to + /// \param target : Target into which render the object + /// \param renderer : Renderer that processes the rendering commands /// //////////////////////////////////////////////////////////// - void Draw(RenderTarget& target, RenderQueue& queue) const; + void Draw(RenderTarget& target, Renderer& renderer) const; //////////////////////////////////////////////////////////// /// Render the specific geometry of the object /// - /// \param target : Target into which render the object - /// \param queue : Render queue to add the rendering commands to + /// \param target : Target into which render the object + /// \param renderer : Renderer that processes the rendering commands /// //////////////////////////////////////////////////////////// - virtual void Render(RenderTarget& target, RenderQueue& queue) const = 0; + virtual void Render(RenderTarget& target, Renderer& renderer) const = 0; //////////////////////////////////////////////////////////// // Member data diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index 68f1cbcc..cabb8def 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -30,7 +30,7 @@ //////////////////////////////////////////////////////////// #include #include -#include +#include #include @@ -77,22 +77,6 @@ public : //////////////////////////////////////////////////////////// void Draw(const Drawable& object, const Shader& shader); - //////////////////////////////////////////////////////////// - /// Make sure that what has been drawn so far is rendered - /// - /// Use this function if you use OpenGL rendering commands, - /// and you want to make sure that things will appear on top - /// of all the SFML objects that have been drawn so far. - /// This is needed because SFML doesn't use immediate rendering, - /// it first accumulates drawables into a queue and - /// trigger the actual rendering afterwards. - /// - /// You don't need to call this function if you're not - /// dealing with OpenGL directly. - /// - //////////////////////////////////////////////////////////// - void Flush(); - //////////////////////////////////////////////////////////// /// Get the width of the rendering region of the target /// @@ -168,8 +152,26 @@ public : //////////////////////////////////////////////////////////// sf::Vector2f ConvertCoords(unsigned int x, unsigned int y, const View& view) const; + //////////////////////////////////////////////////////////// + /// Save the current OpenGL render states and matrices + /// + //////////////////////////////////////////////////////////// + void SaveGLStates(); + + //////////////////////////////////////////////////////////// + /// Restore the previously saved OpenGL render states and matrices + /// + //////////////////////////////////////////////////////////// + void RestoreGLStates(); + protected : + //////////////////////////////////////////////////////////// + /// Default constructor + /// + //////////////////////////////////////////////////////////// + RenderTarget(); + //////////////////////////////////////////////////////////// /// Called by the derived class when it's ready to be initialized /// @@ -191,9 +193,11 @@ private : //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - RenderQueue myRenderQueue; ///< Rendering queue storing render commands - View myDefaultView; ///< Default view - View myCurrentView; ///< Current active view + Renderer myRenderer; ///< Renderer that will process the rendering commands of the window + View myDefaultView; ///< Default view + View myCurrentView; ///< Current active view + bool myStatesSaved; ///< Are we between a SaveGLStates and a RestoreGLStates? + bool myViewHasChanged; ///< Has the current view changed? }; } // namespace sf diff --git a/include/SFML/Graphics/RenderWindow.hpp b/include/SFML/Graphics/RenderWindow.hpp index 0e002921..5adc08cc 100644 --- a/include/SFML/Graphics/RenderWindow.hpp +++ b/include/SFML/Graphics/RenderWindow.hpp @@ -138,14 +138,13 @@ private : virtual void OnCreate(); //////////////////////////////////////////////////////////// - /// \brief Function called before the window is displayed + /// \brief Function called after the window has been resized /// /// This function is called so that derived classes can - /// perform their own specific tasks right before the - /// rendered contents are displayed on screen. + /// perform custom actions when the size of the window changes. /// //////////////////////////////////////////////////////////// - virtual void OnDisplay(); + virtual void OnResize(); //////////////////////////////////////////////////////////// /// \brief Activate the target for rendering diff --git a/include/SFML/Graphics/RenderQueue.hpp b/include/SFML/Graphics/Renderer.hpp similarity index 69% rename from include/SFML/Graphics/RenderQueue.hpp rename to include/SFML/Graphics/Renderer.hpp index 73a32ee0..d57395f4 100644 --- a/include/SFML/Graphics/RenderQueue.hpp +++ b/include/SFML/Graphics/Renderer.hpp @@ -22,50 +22,87 @@ // //////////////////////////////////////////////////////////// -#ifndef SFML_RENDERQUEUE_HPP -#define SFML_RENDERQUEUE_HPP +#ifndef SFML_RENDERER_HPP +#define SFML_RENDERER_HPP //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include #include +#include #include #include -#include -#include namespace sf { -namespace priv -{ - class Batch; - class GeometryRenderer; -} - class Image; class Shader; //////////////////////////////////////////////////////////// -/// \brief Implements a queue of rendering commands +/// \brief Handles the low-level rendering (states and geometry) /// //////////////////////////////////////////////////////////// -class SFML_API RenderQueue : NonCopyable +class SFML_API Renderer : NonCopyable { +public : + + //////////////////////////////////////////////////////////// + /// \brief Types of primitives to be rendererd + /// + //////////////////////////////////////////////////////////// + enum PrimitiveType + { + TriangleList, ///< Simple list of triangles + TriangleStrip, ///< Triangle strip (consecutive triangles always share two points) + TriangleFan, ///< Triangle fan (one center point + outline points) + QuadList ///< Simple list of quads + }; + public : //////////////////////////////////////////////////////////// /// \brief Default constructor /// //////////////////////////////////////////////////////////// - RenderQueue(); + Renderer(); //////////////////////////////////////////////////////////// /// \brief Destructor /// //////////////////////////////////////////////////////////// - ~RenderQueue(); + ~Renderer(); + + //////////////////////////////////////////////////////////// + /// \brief Initialize the renderer (set the default states, etc.) + /// + //////////////////////////////////////////////////////////// + void Initialize(); + + //////////////////////////////////////////////////////////// + /// \brief Save the current OpenGL render states and matrices + /// + /// \see RestoreGLStates + /// + //////////////////////////////////////////////////////////// + void SaveGLStates(); + + //////////////////////////////////////////////////////////// + /// \brief Restore the previously saved OpenGL render states and matrices + /// + /// \see SaveGLStates + /// + //////////////////////////////////////////////////////////// + void RestoreGLStates(); + + //////////////////////////////////////////////////////////// + /// Clear the color buffer + /// + /// \param color Color to use to clear the color buffer + /// + //////////////////////////////////////////////////////////// + void Clear(const Color& color); //////////////////////////////////////////////////////////// /// \brief Save the current render states @@ -208,15 +245,33 @@ public : void SetShader(const Shader* shader); //////////////////////////////////////////////////////////// - /// \brief Begin a new geometry batch + /// \brief Begin rendering a new geometry batch /// - /// This function starts storing geometry and associates it - /// to the current render states (viewport, color, blending, transform). - /// Note: There's no EndBatch, a batch ends as soon as BeginBatch - /// is called again. + /// You need to call End() to complete the batch and trigger + /// the actual rendering of the geometry that you passed + /// between Begin() and End(). + /// + /// Usage: + /// \begincode + /// renderer.Begin(Renderer::TriangleList); + /// renderer.AddVertex(...); + /// renderer.AddVertex(...); + /// renderer.AddVertex(...); + /// renderer.End(); + /// \endcode + /// + /// \see End /// //////////////////////////////////////////////////////////// - void BeginBatch(); + void Begin(PrimitiveType type); + + //////////////////////////////////////////////////////////// + /// \brief End the current geometry batch and render it + /// + /// \see Begin + /// + //////////////////////////////////////////////////////////// + void End(); //////////////////////////////////////////////////////////// /// \brief Add a new vertex (position only) @@ -271,123 +326,62 @@ public : //////////////////////////////////////////////////////////// void AddVertex(float x, float y, float u, float v, const Color& color); - //////////////////////////////////////////////////////////// - /// \brief Add a new triangle to be rendered - /// - /// This function adds a new triangle, using indices of previously - /// added vertices. Note that the index base is set to 0 - /// everytime a new batch is started (BeginBatch). - /// - /// Example: - /// \begincode - /// queue.BeginBatch(); - /// queue.AddVertex(...); - /// queue.AddVertex(...); - /// queue.AddVertex(...); - /// queue.AddTriangle(0, 1, 2); - /// \endcode - /// - /// \param index0 Index of the first vertex of the triangle - /// \param index1 Index of the second vertex of the triangle - /// \param index2 Index of the third vertex of the triangle - /// - //////////////////////////////////////////////////////////// - void AddTriangle(std::size_t index0, std::size_t index1, std::size_t index2); - - //////////////////////////////////////////////////////////// - /// \brief Render the content of the whole queue - /// - /// After everything has been rendered, the render queue is - /// automatically cleared. - /// - /// \see Clear - /// - //////////////////////////////////////////////////////////// - void Render(); - - //////////////////////////////////////////////////////////// - /// \brief Clear the whole queue without rendering it - /// - //////////////////////////////////////////////////////////// - void Clear(); - private : + //////////////////////////////////////////////////////////// + /// \brief Process a new vertex + /// + /// This function is called by all the public overloads of AddVertex, + /// it processes a new vertex to be rendered. + /// + /// \param x X coordinate of the vertex + /// \param y Y coordinate of the vertex + /// \param u X texture coordinate of the vertex + /// \param v Y texture coordinate of the vertex + /// \param r Red component of the vertex color (normalized) + /// \param g Green component of the vertex color (normalized) + /// \param b Blue component of the vertex color (normalized) + /// \param a Alpha component of the vertex color (normalized) + /// + //////////////////////////////////////////////////////////// + void ProcessVertex(float x, float y, float u, float v, float r, float g, float b, float a); + //////////////////////////////////////////////////////////// // Structure holding the render states that can be stacked //////////////////////////////////////////////////////////// - struct RenderStates + struct States { - RenderStates() : color(255, 255, 255, 255) {} + States() : r(1.f), g(1.f), b(1.f), a(1.f) {} Matrix3 modelView; ///< Model-view matrix - Matrix3 projection; ///< Projection matrix - Color color; ///< Vertex color + float r, g, b, a; ///< Vertex color (normalized components for faster operations) }; - //////////////////////////////////////////////////////////// - // Types - //////////////////////////////////////////////////////////// - typedef std::vector BatchArray; - typedef std::vector VertexArray; - typedef std::vector IndexArray; - //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - RenderStates myStatesStack[16]; ///< Stack of render states - RenderStates* myCurrentStates; ///< Current set of render states - Matrix3 myCurrentTransform; ///< Current combined projection-model-view matrix - const Image* myCurrentTexture; ///< Current texture - const Shader* myCurrentShader; ///< Current pixel shader - Blend::Mode myCurrentBlendMode; ///< Current blending mode - IntRect myCurrentViewport; ///< Current target viewport - Vector2f myCurrentViewportSize; ///< Size of the current viewport (for vertex calculations) - Uint32 myBaseIndex; ///< Base vertex index for the current batch - priv::GeometryRenderer* myRenderer; ///< Optimized geometry renderer - priv::Batch* myCurrentBatch; ///< Current geometry block - BatchArray myBatches; ///< Blocks of geometry to render - VertexArray myVertices; ///< Geometry to be rendered - IndexArray myIndices; ///< Indices defining the triangles to be rendered - Uint32 myCurrentVertexCount; ///< Current number of vertices in the vertex array - Uint32 myCurrentIndexCount; ///< Current number of indices in the index array + States myStatesStack[64]; ///< Stack of render states + States* myStates; ///< Current set of render states + Matrix3 myTransform; ///< Current combined projection-model-view matrix + Matrix3 myProjection; ///< Current projection matrix + const Image* myTexture; ///< Current texture + const Shader* myShader; ///< Current pixel shader + Blend::Mode myBlendMode; ///< Current blending mode + IntRect myViewport; ///< Current target viewport + bool myTextureIsValid; ///< Is the cached texture valid? (if not, the cached value is ignored) + bool myShaderIsValid; ///< Is the cached shader valid? (if not, the cached value is ignored) + bool myBlendModeIsValid; ///< Is the cached blend mode valid? (if not, the cached value is ignored) + bool myViewportIsValid; ///< Is the cached viewport valid? (if not, the cached value is ignored) + Vector2f myViewportSize; ///< Half-size of the current viewport, stored for optimiation purpose }; } // namespace sf -#endif // SFML_RENDERQUEUE_HPP +#endif // SFML_RENDERER_HPP //////////////////////////////////////////////////////////// -/// \class sf::RenderQueue -/// -/// The RenderQueue class allows to delay the actual rendering -/// by storing the sequence of render states and geometry. -/// -/// Delaying rendering is crucial in order to implement batching -/// (grouping all the geometry using the same states, and sending -/// it to the graphics card with only one call), which allow -/// huge improvements in performances. -/// -/// Usage example: -/// \begincode -/// void MyDrawable::Render(sf::RenderTarget& target, sf::RenderQueue& queue) -/// { -/// queue.SetTexture(myImage); -/// queue.BeginBatch(); -/// { -/// queue.AddVertex(...); -/// queue.AddVertex(...); -/// queue.AddVertex(...); -/// -/// queue.AddTriangle(0, 1, 2); -/// } -/// } -/// \endcode -/// -/// Note that this class is meant for internal use only -/// (it is used by render targets), unless you want to -/// inherit from sf::Drawable. +/// \class sf::Renderer /// //////////////////////////////////////////////////////////// diff --git a/include/SFML/Graphics/Shape.hpp b/include/SFML/Graphics/Shape.hpp index 6b5001b4..f93d31bd 100644 --- a/include/SFML/Graphics/Shape.hpp +++ b/include/SFML/Graphics/Shape.hpp @@ -259,7 +259,7 @@ protected : /// /see Drawable::Render /// //////////////////////////////////////////////////////////// - virtual void Render(RenderTarget& target, RenderQueue& queue) const; + virtual void Render(RenderTarget& target, Renderer& renderer) const; private : diff --git a/include/SFML/Graphics/Sprite.hpp b/include/SFML/Graphics/Sprite.hpp index 8a6c38eb..fc5f25ea 100644 --- a/include/SFML/Graphics/Sprite.hpp +++ b/include/SFML/Graphics/Sprite.hpp @@ -158,7 +158,7 @@ protected : /// /see Drawable::Render /// //////////////////////////////////////////////////////////// - virtual void Render(RenderTarget& target, RenderQueue& queue) const; + virtual void Render(RenderTarget& target, Renderer& renderer) const; private : diff --git a/include/SFML/Graphics/Text.hpp b/include/SFML/Graphics/Text.hpp index 9f0f4d54..db687094 100644 --- a/include/SFML/Graphics/Text.hpp +++ b/include/SFML/Graphics/Text.hpp @@ -164,7 +164,7 @@ protected : /// /see Drawable::Render /// //////////////////////////////////////////////////////////// - virtual void Render(RenderTarget& target, RenderQueue& queue) const; + virtual void Render(RenderTarget& target, Renderer& renderer) const; private : diff --git a/include/SFML/Window/Window.hpp b/include/SFML/Window/Window.hpp index 03328ef0..6d7729d9 100644 --- a/include/SFML/Window/Window.hpp +++ b/include/SFML/Window/Window.hpp @@ -439,14 +439,13 @@ private : virtual void OnCreate(); //////////////////////////////////////////////////////////// - /// \brief Function called before the window is displayed + /// \brief Function called after the window has been resized /// /// This function is called so that derived classes can - /// perform their own specific tasks right before the - /// rendered contents are displayed on screen. + /// perform custom actions when the size of the window changes. /// //////////////////////////////////////////////////////////// - virtual void OnDisplay(); + virtual void OnResize(); //////////////////////////////////////////////////////////// /// \brief Called each time an event is received from the internal window diff --git a/samples/opengl/OpenGL.cpp b/samples/opengl/OpenGL.cpp index a5232ee1..a0e90a43 100644 --- a/samples/opengl/OpenGL.cpp +++ b/samples/opengl/OpenGL.cpp @@ -78,11 +78,9 @@ int main() } // Draw the background + window.SaveGLStates(); window.Draw(background); - - // Flush the window, to make sure that our OpenGL cube - // will be rendered on top of the background sprite - window.Flush(); + window.RestoreGLStates(); // Activate the window before using OpenGL commands. // This is useless here because we have only one window which is @@ -141,10 +139,12 @@ int main() glEnd(); // Draw some text on top of our OpenGL object + window.SaveGLStates(); sf::Text text("SFML / OpenGL demo"); text.SetPosition(250.f, 450.f); text.SetColor(sf::Color(255, 255, 255, 170)); window.Draw(text); + window.RestoreGLStates(); // Finally, display the rendered frame on screen window.Display(); diff --git a/samples/shader/Shader.cpp b/samples/shader/Shader.cpp index 45ba013b..c76009df 100644 --- a/samples/shader/Shader.cpp +++ b/samples/shader/Shader.cpp @@ -162,6 +162,9 @@ int main() "Press numpad 2/5 to change the flower shader\n" "Press numpad 3/6 to change the global shader"); +sf::RenderImage test; +test.Create(800, 600); + // Create a clock to measure the total time elapsed sf::Clock clock; diff --git a/src/SFML/Graphics/Batch.cpp b/src/SFML/Graphics/Batch.cpp deleted file mode 100644 index 0a5fdaa6..00000000 --- a/src/SFML/Graphics/Batch.cpp +++ /dev/null @@ -1,138 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -Batch::Batch(const Image* texture, const Shader* shader, Blend::Mode blendMode, const IntRect& viewport) : -myTexture (texture), -myShader (shader), -myBlendMode(blendMode), -myViewport (viewport), -myStart (0), -myCount (0) -{ -} - - -//////////////////////////////////////////////////////////// -bool Batch::Matches(const Image* texture, const Shader* shader, Blend::Mode blendMode, const IntRect& viewport) const -{ - return myTexture == texture && - myShader == shader && - myBlendMode == blendMode && - myViewport.Left == viewport.Left && - myViewport.Top == viewport.Top && - myViewport.Right == viewport.Right && - myViewport.Bottom == viewport.Bottom; -} - - -//////////////////////////////////////////////////////////// -void Batch::Begin(Uint32 index) -{ - myStart = index; -} - - -//////////////////////////////////////////////////////////// -void Batch::End(Uint32 index) -{ - myCount = index - myStart; -} - - -//////////////////////////////////////////////////////////// -void Batch::Render(GeometryRenderer& renderer) const -{ - // Set the viewport - GLCheck(glViewport(myViewport.Left, myViewport.Top, myViewport.GetSize().x, myViewport.GetSize().y)); - - // Set the blending mode - if (myBlendMode == Blend::None) - { - GLCheck(glDisable(GL_BLEND)); - } - else - { - GLCheck(glEnable(GL_BLEND)); - - switch (myBlendMode) - { - // Alpha blending - // glBlendFuncSeparateEXT is used when available to avoid an incorrect alpha value when the target - // is a RenderImage -- in this case the alpha value must be written directly to the target buffer - default : - case Blend::Alpha : - if (GLEW_EXT_blend_func_separate) - GLCheck(glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); - else - GLCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - break; - - // Additive blending - case Blend::Add : - GLCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE)); - break; - - // Multiplicative blending - case Blend::Multiply : - GLCheck(glBlendFunc(GL_DST_COLOR, GL_ZERO)); - break; - } - } - - // Bind the texture - if (myTexture) - myTexture->Bind(); - else - GLCheck(glDisable(GL_TEXTURE_2D)); - - // Bind the pixel shader - if (myShader) - myShader->Bind(); - - // Render the triangles - renderer.RenderTriangles(myStart, myCount); - - // Disable the pixel shader - if (myShader) - myShader->Unbind(); -} - -} // namespace priv - -} // namespace sf diff --git a/src/SFML/Graphics/Batch.hpp b/src/SFML/Graphics/Batch.hpp deleted file mode 100644 index 9d0b430a..00000000 --- a/src/SFML/Graphics/Batch.hpp +++ /dev/null @@ -1,117 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef SFML_BATCH_HPP -#define SFML_BATCH_HPP - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include -#include - - -namespace sf -{ -class Image; -class Shader; - -namespace priv -{ -class GeometryRenderer; - -//////////////////////////////////////////////////////////// -/// \brief Batch of geometry / render states to render -/// -//////////////////////////////////////////////////////////// -class Batch -{ -public : - - //////////////////////////////////////////////////////////// - /// \brief Construct the batch with its render states - /// - /// \param texture Texture to use - /// \param shader Pixel shader - /// \param blendMode Blending mode - /// \param viewport Target viewport - /// - //////////////////////////////////////////////////////////// - Batch(const Image* texture, const Shader* shader, Blend::Mode blendMode, const IntRect& viewport); - - //////////////////////////////////////////////////////////// - /// \brief Check if the batch matches a set of render states - /// - /// \param texture Texture to use - /// \param shader Pixel shader - /// \param blendMode Blending mode - /// \param viewport Target viewport - /// - //////////////////////////////////////////////////////////// - bool Matches(const Image* texture, const Shader* shader, Blend::Mode blendMode, const IntRect& viewport) const; - - //////////////////////////////////////////////////////////// - /// \brief Setup the start index of the batch - /// - /// \param index Start index - /// - //////////////////////////////////////////////////////////// - void Begin(Uint32 index); - - //////////////////////////////////////////////////////////// - /// \brief Setup the end index of the batch - /// - /// \param index End index - /// - //////////////////////////////////////////////////////////// - void End(Uint32 index); - - //////////////////////////////////////////////////////////// - /// \brief Render the contents of the batch - /// - /// \param renderer Renderer to use for rendering - /// - //////////////////////////////////////////////////////////// - void Render(GeometryRenderer& renderer) const; - -private : - - //////////////////////////////////////////////////////////// - // Member data - //////////////////////////////////////////////////////////// - const Image* myTexture; ///< Texture used by the batch - const Shader* myShader; ///< Pixel shader used by the batch - Blend::Mode myBlendMode; ///< Blending mode used by the batch - IntRect myViewport; ///< Target viewport for the batch - Uint32 myStart; ///< Index of the first index to render with this batch - Uint32 myCount; ///< Number of indices to render with this batch -}; - -} // namespace priv - -} // namespace sf - - -#endif // SFML_BATCH_HPP diff --git a/src/SFML/Graphics/Drawable.cpp b/src/SFML/Graphics/Drawable.cpp index ba3a9954..4d9dc86e 100644 --- a/src/SFML/Graphics/Drawable.cpp +++ b/src/SFML/Graphics/Drawable.cpp @@ -26,7 +26,7 @@ // Headers //////////////////////////////////////////////////////////// #include -#include +#include #include #include @@ -366,19 +366,19 @@ const Matrix3& Drawable::GetInverseMatrix() const //////////////////////////////////////////////////////////// /// Draw the object into the specified render target //////////////////////////////////////////////////////////// -void Drawable::Draw(RenderTarget& target, RenderQueue& queue) const +void Drawable::Draw(RenderTarget& target, Renderer& renderer) const { // Set the current model-view matrix - queue.ApplyModelView(GetMatrix()); + renderer.ApplyModelView(GetMatrix()); // Set the current global color - queue.ApplyColor(myColor); + renderer.ApplyColor(myColor); // Set the current alpha-blending mode - queue.SetBlendMode(myBlendMode); + renderer.SetBlendMode(myBlendMode); // Let the derived class render the object geometry - Render(target, queue); + Render(target, renderer); } } // namespace sf diff --git a/src/SFML/Graphics/GeometryRenderer.cpp b/src/SFML/Graphics/GeometryRenderer.cpp deleted file mode 100644 index 13bdf485..00000000 --- a/src/SFML/Graphics/GeometryRenderer.cpp +++ /dev/null @@ -1,68 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -GeometryRenderer* GeometryRenderer::New() -{ - // Choose the best implementation according to the graphics card's capabilities - if (priv::GeometryRendererVBO::IsSupported()) - { - // Use Vertex Buffer Objects - return new priv::GeometryRendererVBO; - } - else if (priv::GeometryRendererVA::IsSupported()) - { - // Use Vertex Arrays - return new priv::GeometryRendererVA; - } - else - { - // Use Immediate Mode - return new priv::GeometryRendererIM; - } -} - - -//////////////////////////////////////////////////////////// -GeometryRenderer::~GeometryRenderer() -{ - // Nothing to do -} - -} // namespace priv - -} // namespace sf diff --git a/src/SFML/Graphics/GeometryRenderer.hpp b/src/SFML/Graphics/GeometryRenderer.hpp deleted file mode 100644 index 4b54b037..00000000 --- a/src/SFML/Graphics/GeometryRenderer.hpp +++ /dev/null @@ -1,106 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef SFML_GEOMETRYRENDERER_HPP -#define SFML_GEOMETRYRENDERER_HPP - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -/// \brief Abstract base class for optimized geometry renderers -/// -//////////////////////////////////////////////////////////// -class GeometryRenderer : NonCopyable -{ -public : - - //////////////////////////////////////////////////////////// - /// \brief Construct a new GeometryRenderer - /// - /// This function selects the best specialization available, - /// according to the capabilities of the system. - /// - /// \return New instance of GeometryRenderer; cannot be NULL - /// - //////////////////////////////////////////////////////////// - static GeometryRenderer* New(); - -public : - - //////////////////////////////////////////////////////////// - /// \brief Virtual destructor - /// - //////////////////////////////////////////////////////////// - virtual ~GeometryRenderer(); - - //////////////////////////////////////////////////////////// - /// \brief Prepare the geometry for rendering - /// - /// This function is called once before all the triangles - /// are rendered. - /// - /// \param vertices Pointer to the vertex array - /// \param verticesCount Number of vertices to render - /// \param indices Pointer to the index array - /// \param indicesCount Number of indices to render - /// - //////////////////////////////////////////////////////////// - virtual void Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t indicesCount) = 0; - - //////////////////////////////////////////////////////////// - /// \brief Stop rendering geometry - /// - /// This function is called once after all the triangles - /// have been rendered. - /// - //////////////////////////////////////////////////////////// - virtual void End() = 0; - - //////////////////////////////////////////////////////////// - /// \brief Render a chunk of triangles - /// - /// The primitives are rendered as a list of triangles (no strip or fan). - /// - /// \param start Index in the indices array of the first index to be rendered - /// \param count Number of indices to be rendered - /// - //////////////////////////////////////////////////////////// - virtual void RenderTriangles(Uint32 start, Uint32 count) = 0; -}; - -} // namespace priv - -} // namespace sf - - -#endif // SFML_GEOMETRYRENDERER_HPP diff --git a/src/SFML/Graphics/GeometryRendererIM.cpp b/src/SFML/Graphics/GeometryRendererIM.cpp deleted file mode 100644 index b25e6a6a..00000000 --- a/src/SFML/Graphics/GeometryRendererIM.cpp +++ /dev/null @@ -1,95 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -bool GeometryRendererIM::IsSupported() -{ - // Immediate mode is always supported - return true; -} - - -//////////////////////////////////////////////////////////// -GeometryRendererIM::GeometryRendererIM() : -myVertices(NULL), -myIndices (NULL) -{ - -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererIM::Begin(const float* vertices, std::size_t, const Uint32* indices, std::size_t) -{ - // Store the geometry informations for later rendering - myVertices = vertices; - myIndices = indices; -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererIM::End() -{ - // Nothing to do -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererIM::RenderTriangles(Uint32 start, Uint32 count) -{ - // Caculate the bounds of the geometry range to render - const Uint32* begin = myIndices + start; - const Uint32* end = begin + count; - - // Begin rendering - glBegin(GL_TRIANGLES); - - // Send the vertices one by one - for (const Uint32* index = begin; index != end; index++) - { - const float* vertex = myVertices + *index * 8; - - glColor4f(vertex[2], vertex[3], vertex[4], vertex[5]); - glTexCoord2f(vertex[6], vertex[7]); - glVertex2f(vertex[0], vertex[1]); - } - - // End rendering - glEnd(); -} - -} // namespace priv - -} // namespace sf diff --git a/src/SFML/Graphics/GeometryRendererIM.hpp b/src/SFML/Graphics/GeometryRendererIM.hpp deleted file mode 100644 index 42f4a35b..00000000 --- a/src/SFML/Graphics/GeometryRendererIM.hpp +++ /dev/null @@ -1,108 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef SFML_GEOMETRYRENDERERIM_HPP -#define SFML_GEOMETRYRENDERERIM_HPP - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -/// \brief Geometry renderer using immediate mode -/// -//////////////////////////////////////////////////////////// -class GeometryRendererIM : public GeometryRenderer -{ -public : - - //////////////////////////////////////////////////////////// - /// \brief Check if this implementation is supported by the system - /// - /// \return True if the immediate mode renderer is supported - /// - //////////////////////////////////////////////////////////// - static bool IsSupported(); - -public : - - //////////////////////////////////////////////////////////// - /// \brief Default constructor - /// - //////////////////////////////////////////////////////////// - GeometryRendererIM(); - - //////////////////////////////////////////////////////////// - /// \brief Prepare the geometry for rendering - /// - /// This function is called once before all the triangles - /// are rendered. - /// - /// \param vertices Pointer to the vertex array - /// \param verticesCount Number of vertices to render - /// \param indices Pointer to the index array - /// \param indicesCount Number of indices to render - /// - //////////////////////////////////////////////////////////// - virtual void Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t indicesCount); - - //////////////////////////////////////////////////////////// - /// \brief Stop rendering geometry - /// - /// This function is called once after all the triangles - /// have been rendered. - /// - //////////////////////////////////////////////////////////// - virtual void End(); - - //////////////////////////////////////////////////////////// - /// \brief Render a chunk of triangles - /// - /// The primitives are rendered as a list of triangles (no strip or fan). - /// - /// \param start Index in the indices array of the first index to be rendered - /// \param count Number of indices to be rendered - /// - //////////////////////////////////////////////////////////// - virtual void RenderTriangles(Uint32 start, Uint32 count); - - //////////////////////////////////////////////////////////// - // Member data - //////////////////////////////////////////////////////////// - const float* myVertices; ///< Pointer to the vertices to render - const Uint32* myIndices; ///< Pointer to the indices to render -}; - -} // namespace priv - -} // namespace sf - - -#endif // SFML_GEOMETRYRENDERERIM_HPP diff --git a/src/SFML/Graphics/GeometryRendererVA.cpp b/src/SFML/Graphics/GeometryRendererVA.cpp deleted file mode 100644 index ddd45ab3..00000000 --- a/src/SFML/Graphics/GeometryRendererVA.cpp +++ /dev/null @@ -1,97 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -bool GeometryRendererVA::IsSupported() -{ - priv::EnsureGlewInit(); - - return GLEW_EXT_vertex_array != 0; -} - - -//////////////////////////////////////////////////////////// -GeometryRendererVA::GeometryRendererVA() : -myIndices(NULL) -{ - priv::EnsureGlewInit(); -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVA::Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t) -{ - static const GLsizei stride = 8 * sizeof(float); - - // Setup positions - GLCheck(glEnableClientState(GL_VERTEX_ARRAY)); - GLCheck(glVertexPointer(2, GL_FLOAT, stride, vertices)); - - // Setup colors - GLCheck(glEnableClientState(GL_COLOR_ARRAY)); - GLCheck(glColorPointer(4, GL_FLOAT, stride, vertices + 2)); - - // Setup texture coordinates - GLCheck(glClientActiveTextureARB(GL_TEXTURE0_ARB)); - GLCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); - GLCheck(glTexCoordPointer(2, GL_FLOAT, stride, vertices + 6)); - - // Lock (compile) the vertex array if supported - if (GLEW_EXT_compiled_vertex_array) - GLCheck(glLockArraysEXT(0, static_cast(verticesCount) / 8)); - - // Store indices for later use - myIndices = indices; -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVA::End() -{ - // Unlock the vertex array if it was locked - if (GLEW_EXT_compiled_vertex_array) - GLCheck(glUnlockArraysEXT()); -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVA::RenderTriangles(Uint32 start, Uint32 count) -{ - GLCheck(glDrawElements(GL_TRIANGLES, static_cast(count), GL_UNSIGNED_INT, myIndices + start)); -} - -} // namespace priv - -} // namespace sf diff --git a/src/SFML/Graphics/GeometryRendererVA.hpp b/src/SFML/Graphics/GeometryRendererVA.hpp deleted file mode 100644 index 0e581a08..00000000 --- a/src/SFML/Graphics/GeometryRendererVA.hpp +++ /dev/null @@ -1,107 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef SFML_GEOMETRYRENDERERVA_HPP -#define SFML_GEOMETRYRENDERERVA_HPP - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -/// \brief Geometry renderer using vertex arrays -/// -//////////////////////////////////////////////////////////// -class GeometryRendererVA : public GeometryRenderer -{ -public : - - //////////////////////////////////////////////////////////// - /// \brief Check if this implementation is supported by the system - /// - /// \return True if the vertex array renderer is supported - /// - //////////////////////////////////////////////////////////// - static bool IsSupported(); - - //////////////////////////////////////////////////////////// - /// \brief Default constructor - /// - //////////////////////////////////////////////////////////// - GeometryRendererVA(); - -public : - - //////////////////////////////////////////////////////////// - /// \brief Prepare the geometry for rendering - /// - /// This function is called once before all the triangles - /// are rendered. - /// - /// \param vertices Pointer to the vertex array - /// \param verticesCount Number of vertices to render - /// \param indices Pointer to the index array - /// \param indicesCount Number of indices to render - /// - //////////////////////////////////////////////////////////// - virtual void Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t indicesCount); - - //////////////////////////////////////////////////////////// - /// \brief Stop rendering geometry - /// - /// This function is called once after all the triangles - /// have been rendered. - /// - //////////////////////////////////////////////////////////// - virtual void End(); - - //////////////////////////////////////////////////////////// - /// \brief Render a chunk of triangles - /// - /// The primitives are rendered as a list of triangles (no strip or fan). - /// - /// \param start Index in the indices array of the first index to be rendered - /// \param count Number of indices to be rendered - /// - //////////////////////////////////////////////////////////// - virtual void RenderTriangles(Uint32 start, Uint32 count); - - //////////////////////////////////////////////////////////// - // Member data - //////////////////////////////////////////////////////////// - const Uint32* myIndices; ///< Pointer to the indices to render -}; - -} // namespace priv - -} // namespace sf - - -#endif // SFML_GEOMETRYRENDERERVA_HPP diff --git a/src/SFML/Graphics/GeometryRendererVBO.cpp b/src/SFML/Graphics/GeometryRendererVBO.cpp deleted file mode 100644 index 6c223397..00000000 --- a/src/SFML/Graphics/GeometryRendererVBO.cpp +++ /dev/null @@ -1,127 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -bool GeometryRendererVBO::IsSupported() -{ - priv::EnsureGlewInit(); - - return GLEW_ARB_vertex_buffer_object != 0; -} - - -//////////////////////////////////////////////////////////// -GeometryRendererVBO::GeometryRendererVBO() : -myVertexBufferSize(0), -myIndexBufferSize (0) -{ - priv::EnsureGlewInit(); - - // Create the buffers - GLCheck(glGenBuffersARB(1, &myVertexBuffer)); - GLCheck(glGenBuffersARB(1, &myIndexBuffer)); -} - - -//////////////////////////////////////////////////////////// -GeometryRendererVBO::~GeometryRendererVBO() -{ - // Free the buffers - GLCheck(glDeleteBuffersARB(1, &myVertexBuffer)); - GLCheck(glDeleteBuffersARB(1, &myIndexBuffer)); -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVBO::Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t indicesCount) -{ - // Update the vertex buffer data (make it grow if it is not large enough) - GLCheck(glBindBufferARB(GL_ARRAY_BUFFER_ARB, myVertexBuffer)); - if (verticesCount > myVertexBufferSize) - { - GLCheck(glBufferDataARB(GL_ARRAY_BUFFER_ARB, verticesCount * sizeof(float), vertices, GL_DYNAMIC_DRAW_ARB)); - myVertexBufferSize = verticesCount; - } - else - { - GLCheck(glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, verticesCount * sizeof(float), vertices)); - } - - // Update the index buffer data (make it grow if it is not large enough) - GLCheck(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, myIndexBuffer)); - if (indicesCount > myIndexBufferSize) - { - GLCheck(glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indicesCount * sizeof(Uint32), indices, GL_DYNAMIC_DRAW_ARB)); - myIndexBufferSize = indicesCount; - } - else - { - GLCheck(glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, indicesCount * sizeof(Uint32), indices)); - } - - static const GLsizei stride = 8 * sizeof(float); - static const float* pointer = NULL; - - // Setup positions - GLCheck(glEnableClientState(GL_VERTEX_ARRAY)); - GLCheck(glVertexPointer(2, GL_FLOAT, stride, pointer)); - - // Setup colors - GLCheck(glEnableClientState(GL_COLOR_ARRAY)); - GLCheck(glColorPointer(4, GL_FLOAT, stride, pointer + 2)); - - // Setup texture coordinates - GLCheck(glClientActiveTextureARB(GL_TEXTURE0_ARB)); - GLCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); - GLCheck(glTexCoordPointer(2, GL_FLOAT, stride, pointer + 6)); -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVBO::End() -{ - // Nothing to do -} - - -//////////////////////////////////////////////////////////// -void GeometryRendererVBO::RenderTriangles(Uint32 start, Uint32 count) -{ - static const Uint32* pointer = NULL; - GLCheck(glDrawElements(GL_TRIANGLES, static_cast(count), GL_UNSIGNED_INT, pointer + start)); -} - -} // namespace priv - -} // namespace sf diff --git a/src/SFML/Graphics/GeometryRendererVBO.hpp b/src/SFML/Graphics/GeometryRendererVBO.hpp deleted file mode 100644 index fcca0495..00000000 --- a/src/SFML/Graphics/GeometryRendererVBO.hpp +++ /dev/null @@ -1,117 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -#ifndef SFML_GEOMETRYRENDERERVBO_HPP -#define SFML_GEOMETRYRENDERERVBO_HPP - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include - - -namespace sf -{ -namespace priv -{ -//////////////////////////////////////////////////////////// -/// \brief Geometry renderer using vertex buffer objects -/// -//////////////////////////////////////////////////////////// -class GeometryRendererVBO : public GeometryRenderer -{ -public : - - //////////////////////////////////////////////////////////// - /// \brief Check if this implementation is supported by the system - /// - /// \return True if the vertex buffer objects renderer is supported - /// - //////////////////////////////////////////////////////////// - static bool IsSupported(); - - //////////////////////////////////////////////////////////// - /// \brief Default constructor - /// - //////////////////////////////////////////////////////////// - GeometryRendererVBO(); - - //////////////////////////////////////////////////////////// - /// \brief Destructor - /// - //////////////////////////////////////////////////////////// - ~GeometryRendererVBO(); - -public : - - //////////////////////////////////////////////////////////// - /// \brief Prepare the geometry for rendering - /// - /// This function is called once before all the triangles - /// are rendered. - /// - /// \param vertices Pointer to the vertex array - /// \param verticesCount Number of vertices to render - /// \param indices Pointer to the index array - /// \param indicesCount Number of indices to render - /// - //////////////////////////////////////////////////////////// - virtual void Begin(const float* vertices, std::size_t verticesCount, const Uint32* indices, std::size_t indicesCount); - - //////////////////////////////////////////////////////////// - /// \brief Stop rendering geometry - /// - /// This function is called once after all the triangles - /// have been rendered. - /// - //////////////////////////////////////////////////////////// - virtual void End(); - - //////////////////////////////////////////////////////////// - /// \brief Render a chunk of triangles - /// - /// The primitives are rendered as a list of triangles (no strip or fan). - /// - /// \param start Index in the indices array of the first index to be rendered - /// \param count Number of indices to be rendered - /// - //////////////////////////////////////////////////////////// - virtual void RenderTriangles(Uint32 start, Uint32 count); - - //////////////////////////////////////////////////////////// - // Member data - //////////////////////////////////////////////////////////// - GLuint myVertexBuffer; ///< Identifier of the vertex buffer - GLuint myIndexBuffer; ///< Identifier of the index buffer - std::size_t myVertexBufferSize; ///< Size of the vertex buffer - std::size_t myIndexBufferSize; ///< Size of the index buffer -}; - -} // namespace priv - -} // namespace sf - - -#endif // SFML_GEOMETRYRENDERERVBO_HPP diff --git a/src/SFML/Graphics/Image.cpp b/src/SFML/Graphics/Image.cpp index c453d3a6..2e06fbc3 100644 --- a/src/SFML/Graphics/Image.cpp +++ b/src/SFML/Graphics/Image.cpp @@ -354,9 +354,6 @@ bool Image::CopyScreen(RenderWindow& window, const IntRect& sourceRect) myWidth = srcRect.GetSize().x; myHeight = srcRect.GetSize().y; - // Make sure that pending drawables are rendered on the target window - window.Flush(); - // We can then create the texture if (window.SetActive() && CreateTexture()) { @@ -642,7 +639,7 @@ Image& Image::operator =(const Image& other) std::swap(myArrayUpdated, temp.myArrayUpdated); std::swap(myTextureUpdated, temp.myTextureUpdated); std::swap(myPixelsFlipped, temp.myPixelsFlipped); - myPixels.swap(temp.myPixels); + std::swap(myPixels, temp.myPixels); return *this; } @@ -658,47 +655,39 @@ bool Image::CreateTexture() return false; // Adjust internal texture dimensions depending on NPOT textures support - unsigned int textureWidth = GetValidSize(myWidth); - unsigned int textureHeight = GetValidSize(myHeight); + myTextureWidth = GetValidSize(myWidth); + myTextureHeight = GetValidSize(myHeight); // Check the maximum texture size unsigned int maxSize = GetMaximumSize(); - if ((textureWidth > maxSize) || (textureHeight > maxSize)) + if ((myTextureWidth > maxSize) || (myTextureHeight > maxSize)) { std::cerr << "Failed to create image, its internal size is too high " - << "(" << textureWidth << "x" << textureHeight << ", " + << "(" << myTextureWidth << "x" << myTextureHeight << ", " << "maximum is " << maxSize << "x" << maxSize << ")" << std::endl; return false; } - // Destroy the previous OpenGL texture if it already exists with another size - if ((textureWidth != myTextureWidth) || (textureHeight != myTextureHeight)) - { - DestroyTexture(); - myTextureWidth = textureWidth; - myTextureHeight = textureHeight; - } - - // Create the OpenGL texture + // Create the OpenGL texture if it doesn't exist yet if (!myTexture) { - GLint previous; - GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous)); - - GLuint texture = 0; + GLuint texture; GLCheck(glGenTextures(1, &texture)); - GLCheck(glBindTexture(GL_TEXTURE_2D, texture)); - GLCheck(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, myTextureWidth, myTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); - GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)); - GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)); - GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST)); - GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST)); myTexture = static_cast(texture); - - GLCheck(glBindTexture(GL_TEXTURE_2D, previous)); } + // Initialize the texture + GLint previous; + GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous)); + GLCheck(glBindTexture(GL_TEXTURE_2D, myTexture)); + GLCheck(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, myTextureWidth, myTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); + GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)); + GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)); + GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST)); + GLCheck(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, myIsSmooth ? GL_LINEAR : GL_NEAREST)); + GLCheck(glBindTexture(GL_TEXTURE_2D, previous)); + myTextureUpdated = false; return true; diff --git a/src/SFML/Graphics/Linux/RenderImageImplPBuffer.cpp b/src/SFML/Graphics/Linux/RenderImageImplPBuffer.cpp index 19616d4c..99219789 100644 --- a/src/SFML/Graphics/Linux/RenderImageImplPBuffer.cpp +++ b/src/SFML/Graphics/Linux/RenderImageImplPBuffer.cpp @@ -204,6 +204,9 @@ bool RenderImageImplPBuffer::UpdateTexture(unsigned int textureId) { if (Activate(true)) { + GLint previous; + GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous)); + // Bind the texture GLCheck(glEnable(GL_TEXTURE_2D)); GLCheck(glBindTexture(GL_TEXTURE_2D, textureId)); @@ -211,8 +214,7 @@ bool RenderImageImplPBuffer::UpdateTexture(unsigned int textureId) // Copy the rendered pixels to the image GLCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, myWidth, myHeight)); - // Deactivate the P-Buffer - Activate(false); + GLCheck(glBindTexture(GL_TEXTURE_2D, previous)); return true; } diff --git a/src/SFML/Graphics/RenderImage.cpp b/src/SFML/Graphics/RenderImage.cpp index 87613f54..ba259764 100644 --- a/src/SFML/Graphics/RenderImage.cpp +++ b/src/SFML/Graphics/RenderImage.cpp @@ -48,7 +48,6 @@ myRenderImage(NULL) //////////////////////////////////////////////////////////// RenderImage::~RenderImage() { - SetActive(false); delete myRenderImage; } @@ -77,12 +76,12 @@ bool RenderImage::Create(unsigned int width, unsigned int height, bool depthBuff // Create the implementation delete myRenderImage; - if (priv::RenderImageImplFBO::IsSupported()) + /*if (priv::RenderImageImplFBO::IsSupported()) { // Use FBO myRenderImage = new priv::RenderImageImplFBO; } - else if (priv::RenderImageImplPBuffer::IsSupported()) + else*/ if (priv::RenderImageImplPBuffer::IsSupported()) { // Use P-Buffer myRenderImage = new priv::RenderImageImplPBuffer; @@ -132,9 +131,6 @@ bool RenderImage::SetActive(bool active) //////////////////////////////////////////////////////////// void RenderImage::Display() { - // Render everything that has been drawn so far - Flush(); - // Update the target image if (myRenderImage) { diff --git a/src/SFML/Graphics/RenderImageImplFBO.cpp b/src/SFML/Graphics/RenderImageImplFBO.cpp index 85bae7e5..c5ab6de9 100644 --- a/src/SFML/Graphics/RenderImageImplFBO.cpp +++ b/src/SFML/Graphics/RenderImageImplFBO.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include @@ -40,7 +41,8 @@ namespace priv //////////////////////////////////////////////////////////// RenderImageImplFBO::RenderImageImplFBO() : myFrameBuffer(0), -myDepthBuffer(0) +myDepthBuffer(0), +myContext (NULL) { } @@ -64,6 +66,9 @@ RenderImageImplFBO::~RenderImageImplFBO() GLuint frameBuffer = static_cast(myFrameBuffer); GLCheck(glDeleteFramebuffersEXT(1, &frameBuffer)); } + + // Destroy the context + delete myContext; } @@ -84,6 +89,10 @@ bool RenderImageImplFBO::IsSupported() //////////////////////////////////////////////////////////// bool RenderImageImplFBO::Create(unsigned int width, unsigned int height, unsigned int textureId, bool depthBuffer) { + // Create the context if not already done + if (!myContext) + myContext = new Context; + // Create the framebuffer object if not already done if (!myFrameBuffer) { @@ -132,9 +141,6 @@ bool RenderImageImplFBO::Create(unsigned int width, unsigned int height, unsigne return false; } - // Unbind the buffers - Activate(false); - return true; } @@ -144,23 +150,12 @@ bool RenderImageImplFBO::Create(unsigned int width, unsigned int height, unsigne //////////////////////////////////////////////////////////// bool RenderImageImplFBO::Activate(bool active) { - if (active) - { - // Bind the buffers - GLCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, myFrameBuffer)); - GLCheck(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, myDepthBuffer)); - } - else - { - // Unbind the buffers - GLCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); - GLCheck(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0)); - } + if (myContext) + myContext->SetActive(active); return true; } - //////////////////////////////////////////////////////////// /// /see RenderImageImpl::UpdateTexture //////////////////////////////////////////////////////////// diff --git a/src/SFML/Graphics/RenderImageImplFBO.hpp b/src/SFML/Graphics/RenderImageImplFBO.hpp index 9ad3b1e0..2529e293 100644 --- a/src/SFML/Graphics/RenderImageImplFBO.hpp +++ b/src/SFML/Graphics/RenderImageImplFBO.hpp @@ -33,6 +33,8 @@ namespace sf { +class Context; + namespace priv { //////////////////////////////////////////////////////////// @@ -88,6 +90,7 @@ private : //////////////////////////////////////////////////////////// unsigned int myFrameBuffer; ///< OpenGL frame buffer object unsigned int myDepthBuffer; ///< Optional depth buffer attached to the frame buffer + Context* myContext; ///< Needs a separate OpenGL context for not messing up the other ones }; } // namespace priv diff --git a/src/SFML/Graphics/RenderQueue.cpp b/src/SFML/Graphics/RenderQueue.cpp deleted file mode 100644 index dea71a8d..00000000 --- a/src/SFML/Graphics/RenderQueue.cpp +++ /dev/null @@ -1,338 +0,0 @@ -//////////////////////////////////////////////////////////// -// -// SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) -// -// This software is provided 'as-is', without any express or implied warranty. -// In no event will the authors be held liable for any damages arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it freely, -// subject to the following restrictions: -// -// 1. The origin of this software must not be misrepresented; -// you must not claim that you wrote the original software. -// If you use this software in a product, an acknowledgment -// in the product documentation would be appreciated but is not required. -// -// 2. Altered source versions must be plainly marked as such, -// and must not be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source distribution. -// -//////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////// -// Headers -//////////////////////////////////////////////////////////// -#include -#include -#include -#include - - -//////////////////////////////////////////////////////////// -// Private data -//////////////////////////////////////////////////////////// -namespace -{ - // Fast float to int conversion - inline sf::Int32 Round(double value) - { - // Use a union rather than reinterpret_cast, because it doesn't break strict-aliasing - // rules and results in a correct behaviour when compiling in optimized mode - union DoubleToInt - { - double d; - sf::Int32 i[2]; - }; - - DoubleToInt u; - u.d = value + 6755399441055744.0; - - #if defined(SFML_ENDIAN_LITTLE) - return u.i[0]; - #else - return u.i[1]; - #endif - } -} - - -namespace sf -{ -//////////////////////////////////////////////////////////// -RenderQueue::RenderQueue() : -myCurrentTexture (NULL), -myCurrentBlendMode (Blend::Alpha), -myBaseIndex (0), -myRenderer (priv::GeometryRenderer::New()), -myCurrentBatch (NULL), -myVertices (512), -myIndices (512), -myCurrentVertexCount(0), -myCurrentIndexCount (0) -{ - myCurrentStates = &myStatesStack[0]; -} - - -//////////////////////////////////////////////////////////// -RenderQueue::~RenderQueue() -{ - // Destroy the geometry renderer - delete myRenderer; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::PushStates() -{ - myCurrentStates++; - *myCurrentStates = *(myCurrentStates - 1); -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::PopStates() -{ - myCurrentStates--; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetModelView(const Matrix3& matrix) -{ - myCurrentStates->modelView = matrix; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::ApplyModelView(const Matrix3& matrix) -{ - myCurrentStates->modelView *= matrix; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetProjection(const Matrix3& matrix) -{ - myCurrentStates->projection = matrix; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::ApplyProjection(const Matrix3& matrix) -{ - myCurrentStates->projection *= matrix; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetColor(const Color& color) -{ - myCurrentStates->color = color; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::ApplyColor(const Color& color) -{ - myCurrentStates->color *= color; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetViewport(const IntRect& viewport) -{ - myCurrentViewport = viewport; - myCurrentViewportSize.x = viewport.GetSize().x / 2.f; - myCurrentViewportSize.y = viewport.GetSize().y / 2.f; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetBlendMode(Blend::Mode mode) -{ - myCurrentBlendMode = mode; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetTexture(const Image* texture) -{ - myCurrentTexture = texture; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::SetShader(const Shader* shader) -{ - myCurrentShader = shader; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::BeginBatch() -{ - // Check if the current batch differs from the new render states - if (!myCurrentBatch || !myCurrentBatch->Matches(myCurrentTexture, myCurrentShader, myCurrentBlendMode, myCurrentViewport)) - { - // Close the current batch - if (myCurrentBatch) - myCurrentBatch->End(myCurrentIndexCount); - - // Create a new one - priv::Batch batch(myCurrentTexture, myCurrentShader, myCurrentBlendMode, myCurrentViewport); - myBatches.push_back(batch); - myCurrentBatch = &myBatches.back(); - myCurrentBatch->Begin(myCurrentIndexCount); - } - - // Update the combined transform matrix - myCurrentTransform = myCurrentStates->projection * myCurrentStates->modelView; - - // Update the current base index - myBaseIndex = myCurrentVertexCount / 8; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::AddVertex(float x, float y) -{ - AddVertex(x, y, 0.f, 0.f, Color::White); -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::AddVertex(float x, float y, float u, float v) -{ - AddVertex(x, y, u, v, Color::White); -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::AddVertex(float x, float y, const Color& color) -{ - AddVertex(x, y, 0.f, 0.f, color); -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::AddVertex(float x, float y, float u, float v, const Color& color) -{ - // Apply the current transform matrix to the vertex position - sf::Vector2f transformedPoint = myCurrentTransform.Transform(sf::Vector2f(x, y)); - - // Apply the current global color - sf::Color combinedColor = myCurrentStates->color * color; - - // Round the vertex position so that it matches the - // viewport's pixels, and thus avoid rendering artifacts - int i1 = Round((transformedPoint.x + 1.f) * myCurrentViewportSize.x); - int i2 = Round((transformedPoint.y + 1.f) * myCurrentViewportSize.y); - transformedPoint.x = i1 / myCurrentViewportSize.x - 1.f; - transformedPoint.y = i2 / myCurrentViewportSize.y - 1.f; - - // Here we choose not to rely on vector::clear and vector::push_back, - // and to handle resizing and appending manually, for performances reasons - - // Resize the vertex buffer if it is too small - std::size_t size = myVertices.size(); - if (myCurrentVertexCount + 8 > size) - myVertices.resize(size + size / 2); - - // Copy the vertex data - float* ptr = &myVertices[myCurrentVertexCount]; - *ptr++ = transformedPoint.x; - *ptr++ = transformedPoint.y; - *ptr++ = combinedColor.r / 255.f; - *ptr++ = combinedColor.g / 255.f; - *ptr++ = combinedColor.b / 255.f; - *ptr++ = combinedColor.a / 255.f; - *ptr++ = u; - *ptr++ = v; - - // Increase the vertex count - myCurrentVertexCount += 8; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::AddTriangle(std::size_t index0, std::size_t index1, std::size_t index2) -{ - // Here we choose not to rely on vector::clear and vector::push_back, - // and to handle resizing and appending manually, for performances reasons - - // Resize the index buffer if it is too small - std::size_t size = myIndices.size(); - if (myCurrentIndexCount + 3 > size) - myIndices.resize(size + size / 2); - - // Copy the index data - myIndices[myCurrentIndexCount + 0] = static_cast(index0 + myBaseIndex); - myIndices[myCurrentIndexCount + 1] = static_cast(index1 + myBaseIndex); - myIndices[myCurrentIndexCount + 2] = static_cast(index2 + myBaseIndex); - - // Increase the index count - myCurrentIndexCount += 3; -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::Render() -{ - if (myCurrentVertexCount && myCurrentIndexCount) - { - // Save the current OpenGL states - GLCheck(glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_VIEWPORT_BIT)); - GLCheck(glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT)); - GLCheck(glDisable(GL_LIGHTING)); - GLCheck(glDisable(GL_DEPTH_TEST)); - GLCheck(glEnable(GL_ALPHA_TEST)); - GLCheck(glAlphaFunc(GL_GREATER, 0)); - GLCheck(glMatrixMode(GL_MODELVIEW)); - GLCheck(glPushMatrix()); - GLCheck(glLoadIdentity()); - GLCheck(glMatrixMode(GL_PROJECTION)); - GLCheck(glPushMatrix()); - GLCheck(glLoadIdentity()); - - // Close the last batch - if (myCurrentBatch) - myCurrentBatch->End(myCurrentIndexCount); - - // Prepare the geometry renderer - myRenderer->Begin(&myVertices[0], myCurrentVertexCount, &myIndices[0], myCurrentIndexCount); - - // Render the batches in order - for (BatchArray::const_iterator it = myBatches.begin(); it != myBatches.end(); ++it) - it->Render(*myRenderer); - - // Stop rendering - myRenderer->End(); - - // Restore the previous OpenGL states - GLCheck(glMatrixMode(GL_PROJECTION)); - GLCheck(glPopMatrix()); - GLCheck(glMatrixMode(GL_MODELVIEW)); - GLCheck(glPopMatrix()); - GLCheck(glPopAttrib()); - GLCheck(glPopClientAttrib()); - } - - // Clear everything - Clear(); -} - - -//////////////////////////////////////////////////////////// -void RenderQueue::Clear() -{ - myBatches.clear(); - myCurrentBatch = NULL; - myCurrentVertexCount = 0; - myCurrentIndexCount = 0; -} - -} // namespace sf diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index ac3a5652..e6c3f633 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -27,12 +27,22 @@ //////////////////////////////////////////////////////////// #include #include -#include #include namespace sf { +//////////////////////////////////////////////////////////// +/// Default constructor +//////////////////////////////////////////////////////////// +RenderTarget::RenderTarget() : +myStatesSaved (false), +myViewHasChanged(false) +{ + +} + + //////////////////////////////////////////////////////////// /// Destructor //////////////////////////////////////////////////////////// @@ -48,16 +58,7 @@ RenderTarget::~RenderTarget() void RenderTarget::Clear(const Color& color) { if (Activate(true)) - { - // Clear the color buffer - GLCheck(glClearColor(color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f)); - GLCheck(glClear(GL_COLOR_BUFFER_BIT)); - - // Clear the render queue - myRenderQueue.Clear(); - - Activate(false); - } + myRenderer.Clear(color); } @@ -66,20 +67,30 @@ void RenderTarget::Clear(const Color& color) //////////////////////////////////////////////////////////// void RenderTarget::Draw(const Drawable& object) { - // Save the current render states - myRenderQueue.PushStates(); + if (Activate(true)) + { + // Update the projection matrix and viewport if the current view has changed + // Note: we do the changes here and not directly in SetView in order to gather + // rendering commands, which is safer in multithreaded environments + if (myViewHasChanged) + { + myRenderer.SetProjection(myCurrentView.GetMatrix()); + myRenderer.SetViewport(GetViewport(myCurrentView)); + myViewHasChanged = false; + } - // Setup the shader - myRenderQueue.SetShader(NULL); + // Save the current render states + myRenderer.PushStates(); - // Setup the viewport - myRenderQueue.SetViewport(GetViewport(myCurrentView)); + // Setup the shader + myRenderer.SetShader(NULL); - // Let the object draw itself - object.Draw(*this, myRenderQueue); + // Let the object draw itself + object.Draw(*this, myRenderer); - // Restore the previous render states - myRenderQueue.PopStates(); + // Restore the previous render states + myRenderer.PopStates(); + } } @@ -87,35 +98,30 @@ void RenderTarget::Draw(const Drawable& object) /// Draw something into the target with a shader //////////////////////////////////////////////////////////// void RenderTarget::Draw(const Drawable& object, const Shader& shader) -{ - // Save the current render states - myRenderQueue.PushStates(); - - // Setup the shader - myRenderQueue.SetShader(&shader); - - // Setup the viewport - myRenderQueue.SetViewport(GetViewport(myCurrentView)); - - // Let the object draw itself - object.Draw(*this, myRenderQueue); - - // Restore the previous render states - myRenderQueue.PopStates(); -} - - -//////////////////////////////////////////////////////////// -/// Make sure that what has been drawn so far is rendered -//////////////////////////////////////////////////////////// -void RenderTarget::Flush() { if (Activate(true)) { - // Draw the whole render queue - myRenderQueue.Render(); + // Update the projection matrix and viewport if the current view has changed + // Note: we do the changes here and not directly in SetView in order to gather + // rendering commands, which is safer in multithreaded environments + if (myViewHasChanged) + { + myRenderer.SetProjection(myCurrentView.GetMatrix()); + myRenderer.SetViewport(GetViewport(myCurrentView)); + myViewHasChanged = false; + } - Activate(false); + // Save the current render states + myRenderer.PushStates(); + + // Setup the shader + myRenderer.SetShader(&shader); + + // Let the object draw itself + object.Draw(*this, myRenderer); + + // Restore the previous render states + myRenderer.PopStates(); } } @@ -127,9 +133,7 @@ void RenderTarget::SetView(const View& view) { // Save it myCurrentView = view; - - // Send the projection matrix to the render queue - myRenderQueue.SetProjection(view.GetMatrix()); + myViewHasChanged = true; } @@ -160,13 +164,10 @@ IntRect RenderTarget::GetViewport(const View& view) const float height = static_cast(GetHeight()); const FloatRect& viewport = view.GetViewport(); - IntRect rect; - rect.Left = static_cast(0.5f + width * viewport.Left); - rect.Top = static_cast(0.5f + height * (1.f - viewport.Bottom)); - rect.Right = static_cast(0.5f + width * viewport.Right); - rect.Bottom = static_cast(0.5f + height * (1.f - viewport.Top)); - - return rect; + return IntRect(static_cast(0.5f + width * viewport.Left), + static_cast(0.5f + height * (1.f - viewport.Bottom)), + static_cast(0.5f + width * viewport.Right), + static_cast(0.5f + height * (1.f - viewport.Top))); } @@ -197,6 +198,39 @@ sf::Vector2f RenderTarget::ConvertCoords(unsigned int x, unsigned int y, const V } +//////////////////////////////////////////////////////////// +/// Save the current OpenGL render states and matrices +//////////////////////////////////////////////////////////// +void RenderTarget::SaveGLStates() +{ + if (Activate(true)) + { + myRenderer.SaveGLStates(); + myStatesSaved = true; + + // Restore the render states and the current view, for SFML rendering + myRenderer.Initialize(); + SetView(GetView()); + } +} + + +//////////////////////////////////////////////////////////// +/// Restore the previously saved OpenGL render states and matrices +//////////////////////////////////////////////////////////// +void RenderTarget::RestoreGLStates() +{ + if (myStatesSaved) + { + if (Activate(true)) + { + myRenderer.RestoreGLStates(); + myStatesSaved = false; + } + } +} + + //////////////////////////////////////////////////////////// /// Called by the derived class when it's ready to be initialized //////////////////////////////////////////////////////////// @@ -206,8 +240,9 @@ void RenderTarget::Initialize() myDefaultView.Reset(FloatRect(0, 0, static_cast(GetWidth()), static_cast(GetHeight()))); SetView(myDefaultView); - // Clear the render queue - myRenderQueue.Clear(); + // Initialize the renderer + if (Activate(true)) + myRenderer.Initialize(); } } // namespace sf diff --git a/src/SFML/Graphics/RenderWindow.cpp b/src/SFML/Graphics/RenderWindow.cpp index d3f77a5b..38166a30 100644 --- a/src/SFML/Graphics/RenderWindow.cpp +++ b/src/SFML/Graphics/RenderWindow.cpp @@ -63,8 +63,7 @@ RenderWindow::~RenderWindow() //////////////////////////////////////////////////////////// bool RenderWindow::Activate(bool active) { - // We only handle activation, for performances and consistency reasons - return active ? SetActive(active) : true; + return SetActive(active); } @@ -91,10 +90,10 @@ void RenderWindow::OnCreate() //////////////////////////////////////////////////////////// -void RenderWindow::OnDisplay() +void RenderWindow::OnResize() { - // Render the drawables drawn so far - Flush(); + // Update the current view (recompute the viewport, which is stored in relative coordinates) + SetView(GetView()); } } // namespace sf diff --git a/src/SFML/Graphics/Renderer.cpp b/src/SFML/Graphics/Renderer.cpp new file mode 100644 index 00000000..568ec891 --- /dev/null +++ b/src/SFML/Graphics/Renderer.cpp @@ -0,0 +1,386 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + + +//////////////////////////////////////////////////////////// +// Private data +//////////////////////////////////////////////////////////// +namespace +{ + // Fast float to int conversion + inline sf::Int32 Round(double value) + { + // Use a union rather than reinterpret_cast, because it doesn't break strict-aliasing + // rules and results in a correct behaviour when compiling in optimized mode + union DoubleToInt + { + double d; + sf::Int32 i[2]; + }; + + DoubleToInt u; + u.d = value + 6755399441055744.0; + + #if defined(SFML_ENDIAN_LITTLE) + return u.i[0]; + #else + return u.i[1]; + #endif + } +} + + +namespace sf +{ +//////////////////////////////////////////////////////////// +Renderer::Renderer() : +myTextureIsValid (false), +myShaderIsValid (false), +myBlendModeIsValid(false), +myViewportIsValid (false) +{ + myStates = &myStatesStack[0]; +} + + +//////////////////////////////////////////////////////////// +Renderer::~Renderer() +{ +} + + +//////////////////////////////////////////////////////////// +void Renderer::Initialize() +{ + // Default render states + GLCheck(glDisable(GL_LIGHTING)); + GLCheck(glDisable(GL_DEPTH_TEST)); + GLCheck(glEnable(GL_ALPHA_TEST)); + GLCheck(glAlphaFunc(GL_GREATER, 0)); + + // Default transform matrices + GLCheck(glMatrixMode(GL_MODELVIEW)); + GLCheck(glLoadIdentity()); + GLCheck(glMatrixMode(GL_PROJECTION)); + GLCheck(glLoadIdentity()); + + // Invalidate the cached SFML states + myTextureIsValid = false; + myShaderIsValid = false; + myBlendModeIsValid = false; + myViewportIsValid = false; +} + + +//////////////////////////////////////////////////////////// +void Renderer::SaveGLStates() +{ + // Save render states + GLCheck(glPushAttrib(GL_ALL_ATTRIB_BITS)); + //GLCheck(glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS)); + + // Save matrices + GLCheck(glMatrixMode(GL_MODELVIEW)); + GLCheck(glPushMatrix()); + GLCheck(glMatrixMode(GL_PROJECTION)); + GLCheck(glPushMatrix()); +} + + +//////////////////////////////////////////////////////////// +void Renderer::RestoreGLStates() +{ + // Restore render states + GLCheck(glPopAttrib()); + //GLCheck(glPopClientAttrib()); + + // Restore matrices + GLCheck(glMatrixMode(GL_PROJECTION)); + GLCheck(glPopMatrix()); + GLCheck(glMatrixMode(GL_MODELVIEW)); + GLCheck(glPopMatrix()); +} + + +//////////////////////////////////////////////////////////// +void Renderer::Clear(const Color& color) +{ + GLCheck(glClearColor(color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f)); + GLCheck(glClear(GL_COLOR_BUFFER_BIT)); +} + + +//////////////////////////////////////////////////////////// +void Renderer::PushStates() +{ + myStates++; + *myStates = *(myStates - 1); +} + + +//////////////////////////////////////////////////////////// +void Renderer::PopStates() +{ + myStates--; +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetModelView(const Matrix3& matrix) +{ + myStates->modelView = matrix; +} + + +//////////////////////////////////////////////////////////// +void Renderer::ApplyModelView(const Matrix3& matrix) +{ + myStates->modelView *= matrix; +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetProjection(const Matrix3& matrix) +{ + myProjection = matrix; +} + + +//////////////////////////////////////////////////////////// +void Renderer::ApplyProjection(const Matrix3& matrix) +{ + myProjection *= matrix; +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetColor(const Color& color) +{ + myStates->r = color.r / 255.f; + myStates->g = color.g / 255.f; + myStates->b = color.b / 255.f; + myStates->a = color.a / 255.f; +} + + +//////////////////////////////////////////////////////////// +void Renderer::ApplyColor(const Color& color) +{ + myStates->r *= color.r / 255.f; + myStates->g *= color.g / 255.f; + myStates->b *= color.b / 255.f; + myStates->a *= color.a / 255.f; +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetViewport(const IntRect& viewport) +{ + if ((viewport.Left != myViewport.Left) || (viewport.Right != myViewport.Right) || + (viewport.Top != myViewport.Top) || (viewport.Bottom != myViewport.Bottom) || + !myViewportIsValid) + { + // Apply the new viewport + GLCheck(glViewport(viewport.Left, viewport.Top, viewport.GetSize().x, viewport.GetSize().y)); + + // Store it + myViewport = viewport; + myViewportIsValid = true; + + // Store the half-size of the viewport for later computations + myViewportSize.x = myViewport.GetSize().x / 2.f; + myViewportSize.y = myViewport.GetSize().y / 2.f; + } +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetBlendMode(Blend::Mode mode) +{ + if ((mode != myBlendMode) || !myBlendModeIsValid) + { + // Apply the new blending mode + if (mode == Blend::None) + { + GLCheck(glDisable(GL_BLEND)); + } + else + { + GLCheck(glEnable(GL_BLEND)); + + switch (mode) + { + // Alpha blending + // glBlendFuncSeparateEXT is used when available to avoid an incorrect alpha value when the target + // is a RenderImage -- in this case the alpha value must be written directly to the target buffer + default : + case Blend::Alpha : + if (GLEW_EXT_blend_func_separate) + GLCheck(glBlendFuncSeparateEXT(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + else + GLCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + break; + + // Additive blending + case Blend::Add : + GLCheck(glBlendFunc(GL_SRC_ALPHA, GL_ONE)); + break; + + // Multiplicative blending + case Blend::Multiply : + GLCheck(glBlendFunc(GL_DST_COLOR, GL_ZERO)); + break; + } + } + + // Store it + myBlendMode = mode; + myBlendModeIsValid = true; + } +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetTexture(const Image* texture) +{ + if ((texture != myTexture) || !myTextureIsValid) + { + // Apply the new texture + if (texture) + texture->Bind(); + else + GLCheck(glDisable(GL_TEXTURE_2D)); + + // Store it + myTexture = texture; + myTextureIsValid = true; + } +} + + +//////////////////////////////////////////////////////////// +void Renderer::SetShader(const Shader* shader) +{ + if ((shader != myShader) || !myShaderIsValid) + { + // Apply the new shader + if (shader) + shader->Bind(); + else if (myShaderIsValid && myShader) + myShader->Unbind(); + + // Store it + myShader = shader; + myShaderIsValid = false; + } +} + + +//////////////////////////////////////////////////////////// +void Renderer::Begin(PrimitiveType type) +{ + // Update the combined transform matrix + myTransform = myProjection * myStates->modelView; + + // Begin rendering + switch (type) + { + case TriangleList : glBegin(GL_TRIANGLES); break; + case TriangleStrip : glBegin(GL_TRIANGLE_STRIP); break; + case TriangleFan : glBegin(GL_TRIANGLE_FAN); break; + case QuadList : glBegin(GL_QUADS); break; + default: break; + } +} + + +//////////////////////////////////////////////////////////// +void Renderer::End() +{ + // End rendering + glEnd(); +} + + +//////////////////////////////////////////////////////////// +void Renderer::AddVertex(float x, float y) +{ + ProcessVertex(x, y, 0.f, 0.f, 1.f, 1.f, 1.f, 1.f); +} + + +//////////////////////////////////////////////////////////// +void Renderer::AddVertex(float x, float y, float u, float v) +{ + ProcessVertex(x, y, u, v, 1.f, 1.f, 1.f, 1.f); +} + + +//////////////////////////////////////////////////////////// +void Renderer::AddVertex(float x, float y, const Color& color) +{ + ProcessVertex(x, y, 0.f, 0.f, color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f); +} + + +//////////////////////////////////////////////////////////// +void Renderer::AddVertex(float x, float y, float u, float v, const Color& color) +{ + ProcessVertex(x, y, u, v, color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f); +} + + +//////////////////////////////////////////////////////////// +void Renderer::ProcessVertex(float x, float y, float u, float v, float r, float g, float b, float a) +{ + // Transform the vertex position by the current model-view-projection matrix + Vector2f position = myTransform.Transform(Vector2f(x, y)); + + // Round the vertex position so that it matches the + // viewport's pixels, and thus avoid rendering artifacts + // @todo remove and find a better solution :) + position.x = Round((position.x + 1.f) * myViewportSize.x) / myViewportSize.x - 1.f; + position.y = Round((position.y + 1.f) * myViewportSize.y) / myViewportSize.y - 1.f; + + // Modulate the vertex color with the current global color + r *= myStates->r; + g *= myStates->g; + b *= myStates->b; + a *= myStates->a; + + // Render the vertex + glColor4f(r, g, b, a); + glTexCoord2f(u, v); + glVertex2f(position.x, position.y); +} + +} // namespace sf diff --git a/src/SFML/Graphics/Shader.cpp b/src/SFML/Graphics/Shader.cpp index ff8dffdb..be11ace2 100644 --- a/src/SFML/Graphics/Shader.cpp +++ b/src/SFML/Graphics/Shader.cpp @@ -218,20 +218,15 @@ void Shader::SetTexture(const std::string& name, const Image& texture) int location = glGetUniformLocationARB(myShaderProgram, name.c_str()); if (location == -1) { - std::cerr << "Texture \"" << name << "\" not found in Shader" << std::endl; + std::cerr << "Texture \"" << name << "\" not found in shader" << std::endl; return; } // Store the texture for later use - if ((texture.GetWidth() > 0) && (texture.GetHeight() > 0)) - { + if (&texture != &CurrentTexture) myTextures[location] = &texture; - } else - { - // An invalid size means that texture is Shader::CurrentTexture myCurrentTexture = location; - } } diff --git a/src/SFML/Graphics/Shape.cpp b/src/SFML/Graphics/Shape.cpp index ed773931..e0299248 100644 --- a/src/SFML/Graphics/Shape.cpp +++ b/src/SFML/Graphics/Shape.cpp @@ -26,7 +26,7 @@ // Headers //////////////////////////////////////////////////////////// #include -#include +#include #include @@ -281,7 +281,7 @@ Shape Shape::Circle(const Vector2f& center, float radius, const Color& color, fl //////////////////////////////////////////////////////////// /// /see Drawable::Render //////////////////////////////////////////////////////////// -void Shape::Render(RenderTarget&, RenderQueue& queue) const +void Shape::Render(RenderTarget&, Renderer& renderer) const { // Make sure the shape has at least 3 points (4 if we count the center) if (myPoints.size() < 4) @@ -292,7 +292,7 @@ void Shape::Render(RenderTarget&, RenderQueue& queue) const const_cast(this)->Compile(); // Shapes only use color, no texture - queue.SetTexture(NULL); + renderer.SetTexture(NULL); // Draw the shape if (myIsFillEnabled) @@ -300,61 +300,59 @@ void Shape::Render(RenderTarget&, RenderQueue& queue) const if (myPoints.size() == 4) { // Special case of a triangle - queue.BeginBatch(); - queue.AddVertex(myPoints[1].Position.x, myPoints[1].Position.y, myPoints[1].Col); - queue.AddVertex(myPoints[2].Position.x, myPoints[2].Position.y, myPoints[2].Col); - queue.AddVertex(myPoints[3].Position.x, myPoints[3].Position.y, myPoints[3].Col); - queue.AddTriangle(0, 1, 2); + renderer.Begin(Renderer::TriangleList); + renderer.AddVertex(myPoints[1].Position.x, myPoints[1].Position.y, myPoints[1].Col); + renderer.AddVertex(myPoints[2].Position.x, myPoints[2].Position.y, myPoints[2].Col); + renderer.AddVertex(myPoints[3].Position.x, myPoints[3].Position.y, myPoints[3].Col); + renderer.End(); } else if (myPoints.size() == 5) { // Special case of a quad - queue.BeginBatch(); - queue.AddVertex(myPoints[1].Position.x, myPoints[1].Position.y, myPoints[1].Col); - queue.AddVertex(myPoints[2].Position.x, myPoints[2].Position.y, myPoints[2].Col); - queue.AddVertex(myPoints[3].Position.x, myPoints[3].Position.y, myPoints[3].Col); - queue.AddVertex(myPoints[4].Position.x, myPoints[4].Position.y, myPoints[4].Col); - queue.AddTriangle(0, 1, 3); - queue.AddTriangle(3, 1, 2); + renderer.Begin(Renderer::TriangleStrip); + renderer.AddVertex(myPoints[1].Position.x, myPoints[1].Position.y, myPoints[1].Col); + renderer.AddVertex(myPoints[2].Position.x, myPoints[2].Position.y, myPoints[2].Col); + renderer.AddVertex(myPoints[4].Position.x, myPoints[4].Position.y, myPoints[4].Col); + renderer.AddVertex(myPoints[3].Position.x, myPoints[3].Position.y, myPoints[3].Col); + renderer.End(); } else { - // General case of a convex polygon - queue.BeginBatch(); - for (std::vector::const_iterator i = myPoints.begin(); i != myPoints.end(); ++i) - queue.AddVertex(i->Position.x, i->Position.y, i->Col); + renderer.Begin(Renderer::TriangleFan); - for (std::size_t i = 1; i < myPoints.size() - 1; ++i) - queue.AddTriangle(0, i, i + 1); + // General case of a convex polygon + for (std::vector::const_iterator i = myPoints.begin(); i != myPoints.end(); ++i) + renderer.AddVertex(i->Position.x, i->Position.y, i->Col); // Close the shape by duplicating the first point at the end - queue.AddTriangle(0, myPoints.size() - 1, 1); + const Point& first = myPoints[1]; + renderer.AddVertex(first.Position.x, first.Position.y, first.Col); + + renderer.End(); } } // Draw the outline if (myIsOutlineEnabled && (myOutline != 0)) { - queue.BeginBatch(); + renderer.Begin(Renderer::TriangleStrip); + for (std::vector::const_iterator i = myPoints.begin() + 1; i != myPoints.end(); ++i) { Vector2f point1 = i->Position; Vector2f point2 = i->Position + i->Normal * myOutline; - queue.AddVertex(point1.x, point1.y, i->OutlineCol); - queue.AddVertex(point2.x, point2.y, i->OutlineCol); - } - - for (std::size_t i = 0; i < myPoints.size() - 2; ++i) - { - queue.AddTriangle(i * 2 + 0, i * 2 + 1, i * 2 + 2); - queue.AddTriangle(i * 2 + 2, i * 2 + 1, i * 2 + 3); + renderer.AddVertex(point1.x, point1.y, i->OutlineCol); + renderer.AddVertex(point2.x, point2.y, i->OutlineCol); } // Close the shape by duplicating the first point at the end - std::size_t begin = 0; - std::size_t last = (myPoints.size() - 2) * 2; - queue.AddTriangle(last, last + 1, begin); - queue.AddTriangle(begin, last + 1, begin + 1); + const Point& first = myPoints[1]; + Vector2f point1 = first.Position; + Vector2f point2 = first.Position + first.Normal * myOutline; + renderer.AddVertex(point1.x, point1.y, first.OutlineCol); + renderer.AddVertex(point2.x, point2.y, first.OutlineCol); + + renderer.End(); } } diff --git a/src/SFML/Graphics/Sprite.cpp b/src/SFML/Graphics/Sprite.cpp index 36feb981..eab5a29c 100644 --- a/src/SFML/Graphics/Sprite.cpp +++ b/src/SFML/Graphics/Sprite.cpp @@ -27,7 +27,7 @@ //////////////////////////////////////////////////////////// #include #include -#include +#include #include @@ -182,7 +182,7 @@ Color Sprite::GetPixel(unsigned int x, unsigned int y) const //////////////////////////////////////////////////////////// /// /see Drawable::Render //////////////////////////////////////////////////////////// -void Sprite::Render(RenderTarget&, RenderQueue& queue) const +void Sprite::Render(RenderTarget&, Renderer& renderer) const { // Get the sprite size float width = static_cast(mySubRect.GetSize().x); @@ -198,16 +198,15 @@ void Sprite::Render(RenderTarget&, RenderQueue& queue) const } // Bind the texture - queue.SetTexture(myImage); + renderer.SetTexture(myImage); // Draw the sprite's geometry - queue.BeginBatch(); - queue.AddVertex(0, 0, coords.Left, coords.Top); - queue.AddVertex(0, height, coords.Left, coords.Bottom); - queue.AddVertex(width, height, coords.Right, coords.Bottom); - queue.AddVertex(width, 0, coords.Right, coords.Top); - queue.AddTriangle(0, 1, 3); - queue.AddTriangle(3, 1, 2); + renderer.Begin(Renderer::TriangleStrip); + renderer.AddVertex(0, 0, coords.Left, coords.Top); + renderer.AddVertex(width, 0, coords.Right, coords.Top); + renderer.AddVertex(0, height, coords.Left, coords.Bottom); + renderer.AddVertex(width, height, coords.Right, coords.Bottom); + renderer.End(); } } // namespace sf diff --git a/src/SFML/Graphics/Text.cpp b/src/SFML/Graphics/Text.cpp index 7e284438..2bd74126 100644 --- a/src/SFML/Graphics/Text.cpp +++ b/src/SFML/Graphics/Text.cpp @@ -27,7 +27,7 @@ //////////////////////////////////////////////////////////// #include #include -#include +#include namespace sf @@ -212,14 +212,14 @@ FloatRect Text::GetRect() const //////////////////////////////////////////////////////////// /// /see Drawable::Render //////////////////////////////////////////////////////////// -void Text::Render(RenderTarget&, RenderQueue& queue) const +void Text::Render(RenderTarget&, Renderer& renderer) const { // No text or not font: nothing to render if (!myFont || myString.IsEmpty()) return; // Bind the font texture - queue.SetTexture(&myFont->GetImage(myCharacterSize)); + renderer.SetTexture(&myFont->GetImage(myCharacterSize)); // Computes values related to the text style bool bold = (myStyle & Bold) != 0; @@ -235,10 +235,12 @@ void Text::Render(RenderTarget&, RenderQueue& queue) const float x = 0.f; float y = static_cast(myCharacterSize); + // Note: + // Here we use a Begin/End pair for each quad because + // the font's texture may change in a call to GetGlyph + // Draw one quad for each character - unsigned int index = 0; Uint32 prevChar = 0; - queue.BeginBatch(); for (std::size_t i = 0; i < myString.GetSize(); ++i) { Uint32 curChar = myString[i]; @@ -252,14 +254,13 @@ void Text::Render(RenderTarget&, RenderQueue& queue) const { float top = y + outlineOffset; float bottom = top + outlineThick; - queue.AddVertex(0, top, outlineCoords.Left, outlineCoords.Top); - queue.AddVertex(0, bottom, outlineCoords.Left, outlineCoords.Bottom); - queue.AddVertex(x, bottom, outlineCoords.Right, outlineCoords.Bottom); - queue.AddVertex(x, top, outlineCoords.Right, outlineCoords.Top); - queue.AddTriangle(index + 0, index + 1, index + 3); - queue.AddTriangle(index + 3, index + 1, index + 2); - index += 4; + renderer.Begin(Renderer::QuadList); + renderer.AddVertex(0, top, outlineCoords.Left, outlineCoords.Top); + renderer.AddVertex(x, top, outlineCoords.Right, outlineCoords.Top); + renderer.AddVertex(x, bottom, outlineCoords.Right, outlineCoords.Bottom); + renderer.AddVertex(0, bottom, outlineCoords.Left, outlineCoords.Bottom); + renderer.End(); } // Handle special characters @@ -278,14 +279,12 @@ void Text::Render(RenderTarget&, RenderQueue& queue) const const FloatRect& coord = curGlyph.TexCoords; // Draw a textured quad for the current character - queue.AddVertex(x + rect.Left - italicCoeff * rect.Top, y + rect.Top, coord.Left, coord.Top); - queue.AddVertex(x + rect.Left - italicCoeff * rect.Bottom, y + rect.Bottom, coord.Left, coord.Bottom); - queue.AddVertex(x + rect.Right - italicCoeff * rect.Bottom, y + rect.Bottom, coord.Right, coord.Bottom); - queue.AddVertex(x + rect.Right - italicCoeff * rect.Top, y + rect.Top, coord.Right, coord.Top); - - queue.AddTriangle(index + 0, index + 1, index + 3); - queue.AddTriangle(index + 3, index + 1, index + 2); - index += 4; + renderer.Begin(Renderer::QuadList); + renderer.AddVertex(x + rect.Left - italicCoeff * rect.Top, y + rect.Top, coord.Left, coord.Top); + renderer.AddVertex(x + rect.Right - italicCoeff * rect.Top, y + rect.Top, coord.Right, coord.Top); + renderer.AddVertex(x + rect.Right - italicCoeff * rect.Bottom, y + rect.Bottom, coord.Right, coord.Bottom); + renderer.AddVertex(x + rect.Left - italicCoeff * rect.Bottom, y + rect.Bottom, coord.Left, coord.Bottom); + renderer.End(); // Advance to the next character x += advance; @@ -296,14 +295,13 @@ void Text::Render(RenderTarget&, RenderQueue& queue) const { float top = y + outlineOffset; float bottom = top + outlineThick; - queue.AddVertex(0, top, outlineCoords.Left, outlineCoords.Top); - queue.AddVertex(0, bottom, outlineCoords.Left, outlineCoords.Bottom); - queue.AddVertex(x, bottom, outlineCoords.Right, outlineCoords.Bottom); - queue.AddVertex(x, top, outlineCoords.Right, outlineCoords.Top); - queue.AddTriangle(index + 0, index + 1, index + 3); - queue.AddTriangle(index + 3, index + 1, index + 2); - index += 4; + renderer.Begin(Renderer::QuadList); + renderer.AddVertex(0, top, outlineCoords.Left, outlineCoords.Top); + renderer.AddVertex(x, top, outlineCoords.Right, outlineCoords.Top); + renderer.AddVertex(x, bottom, outlineCoords.Right, outlineCoords.Bottom); + renderer.AddVertex(0, bottom, outlineCoords.Left, outlineCoords.Bottom); + renderer.End(); } } @@ -330,7 +328,7 @@ void Text::UpdateRect() const float outlineThick = myCharacterSize * (bold ? 0.1f : 0.07f); float charSize = static_cast(myCharacterSize); float space = static_cast(myFont->GetGlyph(L' ', myCharacterSize, bold).Advance); - float lineSpacing = static_cast(myFont->GetLineSpacing(myCharacterSize)); + float lineSpacing = static_cast(myFont->GetLineSpacing(myCharacterSize)); float curWidth = 0; float curHeight = 0; float width = 0; diff --git a/src/SFML/Graphics/Win32/RenderImageImplPBuffer.cpp b/src/SFML/Graphics/Win32/RenderImageImplPBuffer.cpp index 44e90f60..e3e7a60d 100644 --- a/src/SFML/Graphics/Win32/RenderImageImplPBuffer.cpp +++ b/src/SFML/Graphics/Win32/RenderImageImplPBuffer.cpp @@ -195,6 +195,9 @@ bool RenderImageImplPBuffer::UpdateTexture(unsigned int textureId) { if (Activate(true)) { + GLint previous; + GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous)); + // Bind the texture GLCheck(glEnable(GL_TEXTURE_2D)); GLCheck(glBindTexture(GL_TEXTURE_2D, textureId)); @@ -202,8 +205,7 @@ bool RenderImageImplPBuffer::UpdateTexture(unsigned int textureId) // Copy the rendered pixels to the image GLCheck(glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, myWidth, myHeight)); - // Deactivate the P-Buffer - Activate(false); + GLCheck(glBindTexture(GL_TEXTURE_2D, previous)); return true; } diff --git a/src/SFML/Window/Linux/ContextGLX.cpp b/src/SFML/Window/Linux/ContextGLX.cpp index bb32862e..53c007df 100644 --- a/src/SFML/Window/Linux/ContextGLX.cpp +++ b/src/SFML/Window/Linux/ContextGLX.cpp @@ -147,13 +147,6 @@ void ContextGLX::UseVerticalSync(bool enabled) } -//////////////////////////////////////////////////////////// -bool ContextGLX::IsContextActive() -{ - return glXGetCurrentContext() != NULL; -} - - //////////////////////////////////////////////////////////// void ContextGLX::CreateContext(ContextGLX* shared, unsigned int bitsPerPixel, const ContextSettings& settings) { @@ -201,8 +194,8 @@ void ContextGLX::CreateContext(ContextGLX* shared, unsigned int bitsPerPixel, co glXGetConfig(myDisplay, &visuals[i], GLX_DEPTH_SIZE, &depth); glXGetConfig(myDisplay, &visuals[i], GLX_STENCIL_SIZE, &stencil); glXGetConfig(myDisplay, &visuals[i], GLX_SAMPLE_BUFFERS_ARB, &multiSampling); - glXGetConfig(myDisplay, &visuals[i], GLX_SAMPLES_ARB, &samples); - + glXGetConfig(myDisplay, &visuals[i], GLX_SAMPLES_ARB, &samples); + // First check the mandatory parameters if ((RGBA == 0) || (doubleBuffer == 0)) continue; @@ -283,10 +276,10 @@ void ContextGLX::CreateContext(ContextGLX* shared, unsigned int bitsPerPixel, co glXGetConfig(myDisplay, bestVisual, GLX_DEPTH_SIZE, &depth); glXGetConfig(myDisplay, bestVisual, GLX_STENCIL_SIZE, &stencil); glXGetConfig(myDisplay, bestVisual, GLX_SAMPLE_BUFFERS_ARB, &multiSampling); - glXGetConfig(myDisplay, bestVisual, GLX_SAMPLES_ARB, &samples); + glXGetConfig(myDisplay, bestVisual, GLX_SAMPLES_ARB, &samples); mySettings.DepthBits = static_cast(depth); mySettings.StencilBits = static_cast(stencil); - mySettings.AntialiasingLevel = multiSampling ? samples : 0; + mySettings.AntialiasingLevel = multiSampling ? samples : 0; // Change the target window's colormap so that it matches the context's one ::Window root = RootWindow(myDisplay, DefaultScreen(myDisplay)); diff --git a/src/SFML/Window/Linux/ContextGLX.hpp b/src/SFML/Window/Linux/ContextGLX.hpp index 933ff5c6..63445825 100644 --- a/src/SFML/Window/Linux/ContextGLX.hpp +++ b/src/SFML/Window/Linux/ContextGLX.hpp @@ -98,14 +98,6 @@ public : //////////////////////////////////////////////////////////// virtual void UseVerticalSync(bool enabled); - //////////////////////////////////////////////////////////// - /// \brief Check if a context is active on the current thread - /// - /// \return True if there's an active context, false otherwise - /// - //////////////////////////////////////////////////////////// - static bool IsContextActive(); - private : //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/Win32/ContextWGL.cpp b/src/SFML/Window/Win32/ContextWGL.cpp index eb835dc4..b180c3a3 100644 --- a/src/SFML/Window/Win32/ContextWGL.cpp +++ b/src/SFML/Window/Win32/ContextWGL.cpp @@ -136,13 +136,6 @@ void ContextWGL::UseVerticalSync(bool enabled) } -//////////////////////////////////////////////////////////// -bool ContextWGL::IsContextActive() -{ - return wglGetCurrentContext() != NULL; -} - - //////////////////////////////////////////////////////////// void ContextWGL::CreateContext(ContextWGL* shared, unsigned int bitsPerPixel, const ContextSettings& settings) { diff --git a/src/SFML/Window/Win32/ContextWGL.hpp b/src/SFML/Window/Win32/ContextWGL.hpp index 379b6fe2..52405980 100644 --- a/src/SFML/Window/Win32/ContextWGL.hpp +++ b/src/SFML/Window/Win32/ContextWGL.hpp @@ -97,14 +97,6 @@ public : //////////////////////////////////////////////////////////// virtual void UseVerticalSync(bool enabled); - //////////////////////////////////////////////////////////// - /// \brief Check if a context is active on the current thread - /// - /// \return True if there's an active context, false otherwise - /// - //////////////////////////////////////////////////////////// - static bool IsContextActive(); - private : //////////////////////////////////////////////////////////// diff --git a/src/SFML/Window/Window.cpp b/src/SFML/Window/Window.cpp index e8eedaa7..60a0daff 100644 --- a/src/SFML/Window/Window.cpp +++ b/src/SFML/Window/Window.cpp @@ -341,9 +341,6 @@ bool Window::SetActive(bool active) const //////////////////////////////////////////////////////////// void Window::Display() { - // Notify the derived class - OnDisplay(); - // Limit the framerate if needed if (myFramerateLimit > 0) { @@ -399,7 +396,7 @@ void Window::OnCreate() //////////////////////////////////////////////////////////// -void Window::OnDisplay() +void Window::OnResize() { // Nothing by default } @@ -418,6 +415,10 @@ void Window::OnEvent(const Event& event) return; } + // Notify resize events + if (event.Type == Event::Resized) + OnResize(); + myEvents.push(event); }