From ca9e1fb0cafa5549859f0e90f5d7a979f1c75d5c Mon Sep 17 00:00:00 2001 From: Matchu Date: Wed, 8 Dec 2010 20:15:46 -0500 Subject: [PATCH] cache item show pages as a first try :) --- Gemfile | 2 ++ Gemfile.lock | 2 ++ app/controllers/items_controller.rb | 1 + app/controllers/sweeper_controller.rb | 8 +++++++ app/models/item.rb | 4 ++++ app/models/item_sweeper.rb | 28 +++++++++++++++++++++++++ config/application.rb | 2 +- config/environments/development.rb | 4 +++- config/environments/production.rb | 4 +++- vendor/cache/memcache-client-1.8.5.gem | Bin 0 -> 31744 bytes 10 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 app/controllers/sweeper_controller.rb create mode 100644 app/models/item_sweeper.rb create mode 100644 vendor/cache/memcache-client-1.8.5.gem diff --git a/Gemfile b/Gemfile index 676890ef..21d847a2 100644 --- a/Gemfile +++ b/Gemfile @@ -39,6 +39,8 @@ group :development_async, :production do gem 'em-http-request',:git => 'git://github.com/igrigorik/em-http-request.git', :require => 'em-http' gem 'thin', '~> 1.2.7' + + gem 'memcache-client', '~> 1.8.5', :require => ['memcache', 'memcache/event_machine'] end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 156dbb18..819b2aa0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -91,6 +91,7 @@ GEM i18n (>= 0.4.1) mime-types (~> 1.16) treetop (~> 1.4.8) + memcache-client (1.8.5) mime-types (1.16) msgpack (0.4.3) openneo-auth-signatory (0.1.0) @@ -163,6 +164,7 @@ DEPENDENCIES haml (~> 3.0.18) hoptoad_notifier jammit (~> 0.5.3) + memcache-client (~> 1.8.5) msgpack (~> 0.4.3) mysqlplus! openneo-auth-signatory (~> 0.1.0) diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb index 028448e9..9b26b2e0 100644 --- a/app/controllers/items_controller.rb +++ b/app/controllers/items_controller.rb @@ -1,5 +1,6 @@ class ItemsController < ApplicationController before_filter :set_query + caches_action :show, :layout => false def index if params.has_key?(:q) diff --git a/app/controllers/sweeper_controller.rb b/app/controllers/sweeper_controller.rb new file mode 100644 index 00000000..42e9a157 --- /dev/null +++ b/app/controllers/sweeper_controller.rb @@ -0,0 +1,8 @@ +class SweeperController < ActionController::Base + def expire_action_proxy(options) + options[:only_path] = true + path = Rails.application.routes.url_helpers.url_for(options) + fragment_name = "#{LocalImpressHost}#{path}" + expire_fragment(fragment_name) + end +end diff --git a/app/models/item.rb b/app/models/item.rb index 5c978b3c..249b5030 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -1,3 +1,5 @@ +# requires item sweeper at bottom + class Item < ActiveRecord::Base SwfAssetType = 'object' @@ -705,3 +707,5 @@ class Item < ActiveRecord::Base class SearchError < ArgumentError;end end + +require 'item_sweeper' diff --git a/app/models/item_sweeper.rb b/app/models/item_sweeper.rb new file mode 100644 index 00000000..7e9a8d62 --- /dev/null +++ b/app/models/item_sweeper.rb @@ -0,0 +1,28 @@ +puts 'Hey! Item sweeper!' + +class ItemSweeper < ActionController::Caching::Sweeper + observe Item + + def after_update(item) + expire_cache_for(item) + end + + def after_destroy(item) + expire_cache_for(item) + end + + private + def expire_cache_for(item) + options = {:controller => 'items', :action => 'show', :id => item.id} + expire_action(options) + end + + def expire_action(options) + if @controller + super + elsif LocalImpressHost + @tmp_controller ||= SweeperController.new + @tmp_controller.expire_action_proxy(options.dup) + end + end +end diff --git a/config/application.rb b/config/application.rb index 795a7e99..24ea28c7 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,7 +20,7 @@ module OpenneoImpressItems # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # Activate observers that should always be running - # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + config.active_record.observers = :item_sweeper # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. diff --git a/config/environments/development.rb b/config/environments/development.rb index 3a320a36..d501eb51 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -12,7 +12,7 @@ OpenneoImpressItems::Application.configure do # Show full error reports and disable caching config.consider_all_requests_local = true config.action_view.debug_rjs = true - config.action_controller.perform_caching = false + config.action_controller.perform_caching = true #false # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false @@ -20,4 +20,6 @@ OpenneoImpressItems::Application.configure do config.active_support.deprecation = :log end +LocalImpressHost = 'betanewimpress.openneo.net' + RemoteImpressHost = 'beta.impress.openneo.net' diff --git a/config/environments/production.rb b/config/environments/production.rb index 4797a853..409fe62a 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -25,7 +25,7 @@ OpenneoImpressItems::Application.configure do # config.logger = SyslogLogger.new # Use a different cache store in production - # config.cache_store = :mem_cache_store + config.cache_store = :mem_cache_store # Disable Rails's static asset server # In production, Apache or nginx will already do this @@ -43,6 +43,8 @@ OpenneoImpressItems::Application.configure do config.active_support.deprecation = :log end +LocalImpressHost = 'newimpress.openneo.net' + RemoteImpressHost = 'impress.openneo.net' USE_FIBER_POOL = true diff --git a/vendor/cache/memcache-client-1.8.5.gem b/vendor/cache/memcache-client-1.8.5.gem new file mode 100644 index 0000000000000000000000000000000000000000..bbf23945aaa1ad72cd42d699686484fa8ab02d54 GIT binary patch literal 31744 zcmd41Q*b6s^zIw;jXB{PJ9%Ti zx#}>yA?AMUm~}6!?Yy?{Sa9$h|Hv)r?YZ(XZy9&1CukQoj1HGPx6YW_5 zAvk+0_5{JVa(p~5vnrOp27Gb@a&nGLwFwU@y5fz94t&JAh&!9_HEM6%Q@`I@!&u^{ zOBczrgUJ-b79*9W2CQLF3bm;lB25H{!Y$)Wjnm{x4(zdGYQ@n-|LWOELfyjUyZ2}o z=o4sAk|GXL3*a2xxNv37l2YUMazS4?*73>%~5npIH;a}QVOQvvQSlrd`5 z%`5%Tm*gPg`2rAdfNls3QGxShBSuHa%NK^YpZjMr??Dj7D)P7RRNb8~mNndc-3Sjl z2HaEkdBbnc2tAf%T~2yt9Eh1nj)Z3Ex5t&9YoH{~94l#rz$HV~uLUS{=E@b~{Dn)- z<`m|hL#d68G(xg}KnjsG$d%V7H6t^(V4qVGW<8)vIm!Vz{?UTP9HUw_vA7X@egNc8 zJ^i?aPl|SVRr2}F&`l6z|xa1v5;zjm$zIzPBMItd*9OH&JIpza6x{A z)S=FSpUvO~J7G2Fb6>towq> zY>j1^+1_Y}N(_Ysh0^p1^uuw)Q4NlT-}JME-V)dVhB|@Ty6NHDbV3V?MqsG4>Ecr- zekqN>%wU=-Ch`skp$ozZQ>n6W@z>w$;!@SCeJbEcO>!C2wGJwuo}X6n;2iNpaR7N% zq0ia?Hko5>OVp9UNa;9z($7yxT!q^s@&Q{iZutRVitJA9svpiGp6uXvhG;7bDS-(G zms%MdVW=r=_Ct4w4zB(g>Z%SHoef-Kf;ryY2p^GTsuc8`r4}c6&G0%`)ZiY4>oHII zAbKy%8U`~M=Bz~#*ZHlweRlXg)L1e31w;gxCe9j?3DtcPJn=}1oqG`dD}z?q(nvdz-x zn?`q|x}9AB*DDNL_-avH(H?FwDI5gtdV>sy+&H&XEBH-Ye42Rz8H4?_)w!H4 z00nA=J88Vk-37ZKhB@RUv!b}d0*DyhkhVx*>LX9 zNY_^q<`1RECPui4NiJzdR{wnwu+~RXOGTmfC^cn<%J)VSS{P-5qE)qPKB3ppK||=EB;8%!dC&o} zn-Jb4GN*fudxeE3R3&`BS4x(6?K{_j-{QRmT*f+F5H9MFeHs{1Sv40}Mh1+ilIXyT zmn(Q$dXPhw^|9~>dLtq>@*Ko(aT+<|G7c#{VL-;H3K-YwAlNc;8JDpRgxuw<3biIb z5@TQ_wfvB;Sn9nri!8@-952`5+jh#e9lMU%*xU;42s?uEw3-eg4VMnqU3bc}&hM8Z zmcVJWBGAo`%6S>^tvI0qz@w-Zt06Ucn?xWzO0-Jcp01Zyh*&i%2;f$IuFZ7gNk-S$Wl8Q!doYpjO zC`We;aU%dIr;@K78cLOuKJYh7LZ6XI$Pc9#BcC375-~R61zV=TFBu-;#E@W-^ zcOTQZH|~!Y%0}U27|&EW_~S!v2_CtI16C1p6rE}pScb5=8+s0GpcN2Or^Bz)z{o}{ z(Sp(ehIQbDPoA+B!@)BHrpRb zLbP#;(l&8|q;O(njq{Spo=c8vh~2%-J4h>Lwtparj9|L-zykNw$nPyz&yQT_&Ceq> zDtOA*f(+^FNB4%w0vx-8Ga->mGCzTK$|vO$ACf<9ygxZuW(2x}oP>=o1&&|DZ;pk@ zwqi$r_3Tl;pKOSuxIWpPEhW&w+h)8}ceZ7~ES%T)=%^6YGI5a7gMV2c9w1}Sy zu#aN>gUpqMLe7K`Zw@BNd6Az#x4LnMA0+@9g#}+T;?@Wf1BLq_nFNNiHV!0<2j!54 z3u9`q!TiHuoTW32^Cu!M2*&O{53PLzM;KsyJV+0A=(KT!-KB5byddR)eLbF1>_Kdg zHwgmF`L~SpDUaSU+!kPVG546X_dAEx?A7jv*sqsDE1OmnQ0nwHgv0PRm;(be!25Dh$Up0J?lWGco-vpRqm^!gdL#h zaS8p4e8WnWoWMx4RjIU~x35|xqk_S?`TROTw(#P@Pew_!0SZ9K@4TTMok3?`DI~)K z1d1`af`t&7CukWbF)`0f{X=M?rZEz+R-EY5hR|WEqAT~x-*DrI4W*YTTyF-|sDXuc z@Ra|IN?w0t6RVNa4L`k?cJnqDftmU%k5rx5`%V2v$veq-1)WP{LB z;a{!9r)%aA|I#0*1Q<5wL{Mui+tsnSnGy3v>xAVD^VB=HRp$}vqv zL%Yi_k#jtXIawDc#$hU(@h{d`ts}N}r|oUXe{BS2OGyI3g-R{(qK?<_?ds8%`b)>` zM*7?D9%e-j`C-Tvn$^T>96WyVqRa3?p9?n&kV6y(^d0c0-O^{-3@Wv1zwfO4DyRXj zFYLELkq>d74{KDrgheL1Ld{8{JoXF|nY-!z3Vh&AL&(E&bh=;A_(?7Yn2^aKFFci- zZ%Y!DYINMTB!fgk+R)^J)IfotLSFww*#ZC3{eA9_8zbuOg%yXma+3;|R3s`Ih$95I z>gclQD8~8iEO#w{u%1Xsa~L7~E}@M?N4#CQQT z{&nM2e@_T?XQE$5TAPNaWEhDRl%#lK{8HKvqka2@!gG`eO!y{>^r~RsbKj@`@YM4( z=U;e2QJ#LK?V$*74;vPR7=oe?9YIfc8$>bnXBFMl^5Y8{v_%Z_`gC|?>5&Z(>NI!b zbqQgA*F^x3p^^nGZx{~|*i^D`1Z1E$O%m1i9AcnS!;LacGCO~h$J*&hh?R!#SZ^&* zmPC&}U3ymhwmJ%kH?`Bph;8~au+Cmt_L{?7iFp%|30wpH8_0{Fl>=RG5C+Hs=Z?;5t^J=+WAZd5DWNd?B zoRL2~C|42HoK0UHlV~h|!XINV-cb%==2eTf#=MI?;sYHs8_iO}h%c(ito2uwVqScT zJegDoA}#BsP^dWxkD|0W3vG=~6gim(2?^ZcwA>U0OF>b-_`95#WJc9S*8+oj_Gu!f zt!(Nlzg=3+YWs;`!9i3Lr%8^=FHuLl16#go&LqkW;(!sc2P^7w^^Ikd?1P$53wj%k z%afvM8!t3kH%QkQF2tCiWb&2iHV3s3d)zkt##hwzi*+wK0t7f>wJUMkGE93i<9Gte zJ;RyVdJ(3pVw$3yU7tmgM9_&W6_wO18oPa0^=SYFCgDWi?l|3sQp#pW9^{p3O5}abE(r zP}m%eGnYq~J0fq?`>NC2bz7tBHxIjGDhc$5{1u8O#fm1$k`nC)g79ko7Jt@_5AER!FpKrH95g25P4jkHaS+u4_M0rMbo5JXQ=3 zzTJOV56L0I>PrIbb|oMbBTY+8Nhb`g09UNvA}D~12}f^{FD1hfvjeDe{n7rQ$^wOydS7(Q$g&Xf^l-T}DAno$SPXFh(Z*Ei zslFc;8&rpEp_pf6jfjetFnxeE^w1cB$j6Y38^JDl0G=Q*)lA;JH;NLz&1G3?jB1>T ztS2}+aSHBlB5G_9Uio0Nbd8m2*e`Rq&2=xRJH!wUA*5K>e2d1RhuI9gN;kq*&9Ri! zXIZ7G(hNoI_^}K291F< zbp_51M3adHq1to7Mv#o~m~?`8$&S9-Gf^1qC`v~3*WTIvS2^9%Y=EYa^;~{0WU~ef zvs~zONYg}|H6n!JoD?%7OSyMmkfhj;(MYmW%Vf`zM20(Zk_tJmyp4OKuw_e77eGlc zdVtk@6>J$Cch&EoMjyTB(d7VpJ{4>fw>&nzS9tcVb>KtJz)zY%%h-T}!74y!M)QggE3c>S{Y}u*2Og@B-xlKli2E<=H@{#Iu z=O+AyDq+zo5F|-@KVvV0!y?=nR|20NM64xu`C)Ah{9Vm$Gi9kA`(~~5K`Jp6vQzb5 zW#P90FL-h3soG6Z&5?;hxkl{hn-v6E=R&4LNfh#{sldHG(1A8)1h_gs>gCCgRG-WG zH1OM(RBe@TAkS~=9I9!XCq;&Xc)364eQFW@nCfbra=3h)ZL*Hnu%t`8h^oc zB%HtDU8r3U#)9>);)4YFpk33(Bi{7>S)lo6sU*suSQHKs5X zENPFu(K7ENb{$;~|B4LxMKkaNX~-wc-(#;?6Qp9AY7grv8EgNy(FlHO@+SeV^9UXu zNj*)uNrb>C&Fp|eC$c9McfGwQy^aG|j{X7TlP`H~00{{#%CA}p>}hvENa)kDCFgDk zN4<61>7rgxRWx7B2O5g-EJZ8*WwWXwf+Z2C{UMdCj~N#zZ6UeJ`qQb3QQDvJJpl(X zXML9{Jrp@8iGWK*M9RElh|g1gEHZ*mhPoF=(xtG>XXNRJ&M{ZdYdZ_=E}DczfX>0V zw^hAA+IUkMhr}L8Js!C&6|Lx`s~tivGb~FcKR1(ec&uXza&8kB3SP9h)Mw9X^Wt>z(iIge!_7nS*af`@GKG)e0NONV<`!Dc88D zg)=V`*hCY7YZDQC#8|vDNIvNp3D{U`+yLW;ai7Bt#Pd_IpL>RJ%KD;jWt1_7p39bK zR6d9n3pZB_jylH#bsTA6D_ip%p2eYR4q(nPgS@D4bReq`7r$`RZV5dseR zz{N&0gLJnVTLKqpBH%hWaVP6gG?e7fx~&wvLtTXe{&8>MP_wt~u*~uiw(Y;ylOnA@{z~F*_5Z zzVDArw>!Cq_rP@h()rh6IX~_BZ4s*Kwp@Up(~OxV7ttzxF0&M!a~D6^;1V5So_B~k zD|#T%%^~-jtLfP#Y&MT6hScqtMj|&~FF!DlDt#+oXgaXFf#OeQo5Tcu9VN|?NmE}K zR%h^mCV^r~@)#NROh<9THGHe=p+~$oiQ6I6^IxGN7{^L#T=H7?$#98K2iClWd1>GV z4xZ${64vSZpWA1Mc#gn8%2Qh_dROp_2K&5@KIGh+Uk@Tzfh4$C=@@138xrPFk#tI` z!n}CqFtcxInT>jy5P>(AxXKiSW|dji{RGF%;^OYNreYF;kO3@fxzc__{6*;KKqI~Y z91?UWXXAt^ks~f4JOXInFQfhNUA1aM{fnVD-?`$~ zzI?n_*;z?3F~fU_=CLUG$Y9(8?w+1&yyfA8r6@##zHoT<@>{+>v_kFZu_(C&IU@Co zg?Rlb%Q7VyV3C*7*Dw7jH}|_=dk2Gyx#iuGp{0uX47YH2yr{FtF^VX}e7;`x^f~;3 zKCaFSbVk?2L^*u!UiL3V&!~j-iuuy>@Ac0QYFQulH!t<9cwqOtr)OukB+f{_JJ-oX z#6(-ZTL;*N&L}9ce^3-0aE~`3g#Zs14)R%i7yMj9Ox@q}fx-j?-@0_nQ;FNY0-+)| zDtvtIjyL>K<(`nVU`Hr9#LqcG&FE3zhp*ms1PZyiPead=k|^bkRNV)}!Xnup>U;t` zB=r1(XZ|a$_MS?E&tMQrP_?l!vd_7>1n3ROxj9cUvAKf0{Cu7rG(KE!@O9wce0~)u z@RgE^mSuivg$KE4)cbyM`gETUqW`rcBZ60j4GX~NTMJaJ#BD)><7*zF&Uxzb^?LEX zJ_{r&IE2gpaCTqV#DpCUrPA7s%lte8+kkQw>f~adqx<@eW>Ou5L5)lt9vCV}WZY_M zly;veDoq^J04pfv{O7vVi0~PiNZ`zS3loep``a$_TIOrjEyLjOyY%JXN%nj30yr_1 zVW9Yk^xSc?w=RtMCp^4zT>W(eVHXoJH!yGaM!sB(8ASUb4udu)d@gu!rAYekG>vp^ zHge`6Nv4V4Z};SAvwjxoV{SE zuZ7QLh~TEb4^-uRdnPMj;!PWvf3G)MZ4BE1NXb+NvjXnFnxHP2L39#U+bGef&mRBU z5*+xXzN@|S=t*+*8F!*kCqby1J=8YMa1luVphc*S*mtTLqguJMKalw~-f+E~j$6g} zJn)aE#kl2+p1VnxfVA5y#8d_$3X5hOau#W}mn`rT;Z7?~F>8TGD%&*95N<^pmoc0} zT~$cAl%m*DS=Fn|U>eai_alOAiJC@B*QLxO^pp0#*EBxr++4@V5zF*yq9*T{TIybC zA{f9LtD(*E7z0UXgZGD`LJ9I2ZQ3W0kw?S=mRVEudaJN{T0Z9wa2!3S+;>=*r~O#{ z*}_Rs*21H_Z$1J~v-ot6gYfUa$;M2qssdJ&$!LFTHKw_~t*&d1m`E=EUo z6$wNBDx=s z-A*6Ta^=nwKjkZm=x;>s-2aft^muB&ot5SS4D$;DDM5IQ!uGO4B8gUn5E^~}XT4iy z#C^>3sl+JoEQg^1^7xqRgqV9Mt+8F7w==Crl`GN%2x*US5x0CMZFIZ$#~FQdMBY}4 z_t?Yfy~ko;;a_w8AqRIojBl}U%rJX^ESbEqkn@kCEfc?!iV5G3L%2~t^{wcaG@Gr% z?_1v2`|oIlgUIibL@$n^N{a=ob@saa)%UR**^J%_vN@~^w75wQJVaJ4n%5KR>6dn& zTR2e;N#zJezu&#zr#B9@J3E+eV(Z~Pe^WYP`)VeNh2a3R$M<(h^p5Mjx2v|#m>c8d zvN*k_y|>DYD4XCj`ZErx4PMnPoPg_V*CQG)ZHTpJsOD|&ml+3L0u@*giq=89G?Ru+ z@R)KrlLvOCjG++4h^ldZv$}=4Hn;ZEaAd^ZH+4Y_Mw}}v1JO-9g%&N7`i1byX!?Ku z1F}@Pjs^bS8EvD=9DkI39O@pQQ+JZA3O-;$^arJVIzOj5H($z(FU%WPS&;~2A90M7 zyAZqIVM=w9kB9Wz+y)LDSm06R1RjgczyG*s=p=$G>2hR+?mM7ISrB8mIfAYl=;>}9 zps zQNi0JiN&5)09QXd3nJ~7@14`SjMXoQA6za_7uDwu z54yes4ZUn%XHq9HsN=`L4+qA!0o$h-7T6)KS=N^jIceN=qN`pn0?%_7F z`n*@?5qj*;x)ovAGP zP2hRoUzHT3>Sy6(h%?6|lVH!`>bMuMkC3#E%H!&=Kd^|pl_ubFYf=%U#kLVlVegoX zOVWaEFiU!qlW53^-9?2?G_Fs>eZb9f#k6ykH9l{5Z|{j7P^@D-qVjtPG=U59w-TDF z>L<=UE(Qb#$OE&Vqur(IW$iRALEo#v170bH21_^w;)Sb`OvuC&aoOJS$ZwdNsG5@x zWnHhU392c9+!b3xt?yg)Ua{ruzooIe3MXtLC6IwWxL6tXK5W_j_Z2|@O2@5Pg;>ii zCa||jyyp(e^Gshou(LeO<%ZJPT(%ry0siWaX-qZfiE@$X&*5|>;vXu2Y^|zK*FEX5 zA1b(~e~&=R0J3dtGZ*MxV~YqV)Q#-S{Py0%n=;9g5}IG9JW1SGMJy|SqTx-XynE;d z5@`It2fhV4@89oURTY9isBNl}zJ0ovtF8|ZeJAafddI#MZ`b{rx#VuTlr^W!&3|@M z5caj#8ngCRR+wk*Gx^S=<%~?!+CNktq3o8iT=dskh^6Hgo)T31|0BJrF2!}PMGw=8 zz1I(rk$#8c7_#)NMkm1{ByMfk&U@6KFYQYvR20%6WD$g?sk{oAiyojX;rk3pgX;8Zl1MUxdF4Ql;WPb2GkGTnhXR1x((4=Jo1w zzQJQhkHa@Ov*h;i`9ATvK6?&T{FAxgx)byX2951uPs?TgAmYh0)LIar@Y&()kg44i z(l-%(mtg<=bUBlvwcUnFZW~EA`5~O}d2;DOK^kGm5IA)FJR)H!Ds>X&Ot~q5XEo|r zsAl|E16*twvVyFISmvk3Wx-jHYEye6z+|op^}p*Ja*m+DC9$$sKfH6Oc+L1rNH3Qn zE0yy3z7EhuttY>V<}Mp6Ncwv2Bc=9%8BcrKvp7tvyW)?{D~uxQByGF?kaX^SIOfBE z%zld9gmgwqWefedUTXmKHg?|X1m=+CB|s$Ch;O(j?{8`{yJ^&ydYHd5a#*fs=+3v0 z5ItC_0-lg}S8f(JvpFh)S!0u;LtQz083Eu=NrOFyDn4{&zIHRcyP#gs6aW;9%nafq z)bcX!&#J@^;$luJkqSw*OCwKGj<^*N$d*>Oo?Xm7DP<{!4A!BzD+&T^ms(s&blNW9 zo3Tgri#&3Lg)!fuA(|=R*2=v~7mi~-Kio`pnEH*IkP71&i6E2-B_ofM%FPYsi{@bZ zP`L%o4&olf&g;vm^4ZS7O2spyIL$+BLCQeEd}IN~@9|jp(m`gI96za#r;sgKa0Bh( zKn8M@Zhi8c*9YS_tQlbl#3vx_r58BP!1&T?nj}vnE9{aB0wgmQo-?nQRw4YSg$cAw zo*P-D@KhGBBC3-tT_fIz*#sNs09z**I1gKhQqYL;iMw;3gp6*GtyvGpJt-2fFv*0b z7$U_((gcAz8PU|gJ$t-wcuwI=3V4K8z?B}X;Hr^$Pd`~2Y10Qqnp|LokD~v4a|K^s zQs#tz-gTs=XQOmQNK8za+710gJq*XkdBB&amVY{>>`?ATepdfv%pa?$NLY374%gS9a%oykC zS{_=@%2A4;N#UoD323x;y~Lu2fYw42e7=HA-Q7386fb`xTZeE9#pEd-hE4a*iy2I6 zt2=>6vMz5al3hoNl6eeTt@;fx}OT;;nB!OML~fj3Ico0=gA9ffVZ zJ_#|RXjDpKcx5IVowu9q+B&=z*M}dM6`_fL)ADZAFw)aBG3;# z9v+-r5`(ZtEhULKwe(XwtOei`ZlnM%9HT)ak)of(tuwzLO3kCcH1&IBSr`lvli+wj z+Pd7`c_bN(7!8dkBxECh>PVgi?o>HVG<@04kIc+^lZM^cplf$p!z9q6q06+EE{9MO zCc`6(F`Ee8pn^={m-7cPKdYj*CvCU45{i)Wle~`x!Ws;o% zH(U8*2){ewvPDQ@vKop>`hZVTt%};Y{8mYdK|#muNJeC<*n0GIgKO48>K`#yA;J{j zlII{kR@_Hy6{5->XEQHzMb8<>N6I7;a03>@Rlj1K7QaK08U{K<%k@!H-As)X2Qhr- zCpvc2nuCn=hL}dK_AIN{2}hX>d$d*C6!9joLzbF!`bjBeVEta&Bm#cKpwo|4>l9P^ znzX@68;X;8t8Gj2g1A+F@^r<{r#_|YqbeDawhJNzx?3}nFLCRx_?g_+n`CPJ;)z9+-FZL6d>o^wFz$fs8wup~FMw4T4}o3tOJnpUthSo^kSlO!F+&RD<4-Gn zPfF$EFn{y?=tZsBwC*(O*JLq&kBUTh&!uGud9Dnz z5Cjzs)NHSdahyYtA~EbdoegvMV9uF8`Kde61~Ee zp!c+KPfCjJvMea4Q;K`A>%HXlVg1wysM~2&l}k0;LZ#}*(xyB0r;v4FHwVhl|IR00 zN2wg|^Hm`4*gvd5B#=zJMbK}|CxbAai%JMnU5!D{woS&8rWJ-5%Q}gh(lXE8Ol{ic zjAsy1R$q>kH_oq+9qPVr7@d=QfVdQd;^$hTA}`{RO`(7*<;6|(rb^poXLGBvj?=|f zmOs)?JwPb(DLXvbv(jQBFrBp{OBc}GJ_(tDRlp)J!8H^x7SHH23X!Y{l0~rEdsFQ$ zehht8KKE=s=sc$w;cyC_*Q0fVkTP&sa+}jU6h{f)!N`)(SdmAsNa5svIRa{JTd zp|pRQaArKp)|OY9r;!7KEtZOhw`+tB*CUxFo=HJWsZ7;+I%(Avu5z+!|# z3+-k|?>1F#;yO3)ya1)*z-r0!ict+Zi`eg?rA9Azm0yi#DgxjyJe*@-xi|d+SO9Lo z?keFtAxiEDC)=mNB|y!G%*XeO70nq>i<0zThn6Ikiz;9JLPVW=BpV`;30tf-H_oRg6rYQ`NsE!Q1O@^{VH=Z8bgfv;G(Srg8>MkfpjU63Im zvAGCXa9lil37?wz)qr$@W#Pz0Zq9R==-{Qoq@NUcC%ZxKM1*{5H0X1hF2<$=Ych}r zU^4pA+rQ%+NG}*-oMUZ zjMr~N{%w?2a=$F&=Rbuz{m(;x8ob@I-a-2fKkE}Kq5h7|q4}+}~Ff;S0|Sh?wVIkbNOiKko#@Sm9z#7USZ)T4;6 z_qeD-o&(y~7rLmDo@H@566-Ikt|`P~PSQ5d@IBO_ANOk@QRUCk(lX*Fy+{7%HWbQ; zq3*|}cdFCU0@9@3F=U+O))6fgtr~v{`Cs_$6UfIDI2?P$cxX)YP-MT+TEh~q58qCC z?m8zpjjTX2*{cO_Afn*f>^i`gUlLhs;Z!#X#_@<_DAu(6M0)Y0tUAo|a-2F}YG$cx zOb4e&RDr-3_UvYTgI?8Lo-&%}-P>I2k@%;1zes#X_|Rx4uX^$Ix%IesU(MiCxf zFuEqT9Q}ub3i4z%ry7Ar$<QdydWKgr7W4ghi zD{y(u^)SFTtCI3c=HYjbMpO~;5w_+4r`Yx-uVrcvy7MtGOQId@D5rzyE|c?1rZc8`FU6fn1g?V|4(<0jggWIzlZ9Fe z^MGwU%fVj$?S`c6MJ8AwsMLvwE^}!3HAe)!p8zNmqvL|c+@Y?LciPu;&4v_iAZqrw zWJ|D&-a$KY4928svvtl$n)!|lzl|yi&)~M}qhb^Nb_%cSrWC@QPXi2VIm0ZRmlvGq(lglB`;KUO8vBJO4pSE+7>l0H{FC8AIHn;C?qHUPt-K5vOt8ncK@Sxr*Gp78X%YqHrn>5>1lM=BxIRp?O0(5M-(+L665FQ=egpi2g|EB z{W~_G?)iOibNFB)jum%$uD~K9K(>|llUY|R(6suRHTQ2X17jyapMO?9wW>o?VS{l; zOur(iLWO85VG^`$(kpDnjZEJRzuFx1tBV(bVd0ly_xxz66twzLM~qb2#OQ+Xtx*G* zo$&`yyROgS$NmNZ4iOq&Z{79|)CM&*_DuwJ>t6t?Vw;7iWiF9jPf zs^oggYn7ckRg<6Z(ZN^UvH5r#)_cFKLegq|;_-1A^QMethc6-!=3I^_Yx?58^&abX z_U@cC^ju{pW1fd-reAw^&y}7xeY3EP^L(`_E^5$wdOc;;;<|CWbB*oO8ytSZ@mKZ# zfRQ_w)T&a^i9%R)W84jn((HGU$Z>u``{B(Ej973p#vs5n$8F)+v;KKtGSX^{sheQK z_f*k&N2*Nm(?V+n;*CD06nedH>`Q827~IXG_bd1q$3kCXqgMRk&a+eyW_c3-)Ys00 zsq-=ZbX(|K3ksqZS8k{r#x=yID_2yAFllzpb)U)pZLk)5Vm zs`yA)z*7;DC;D2tqePr!J3IIvAs;gW-*Dj$hcxUZt#&MCc$(exogq0W>jFGVQgltg zlIusgcj~Ee6>>;Zeb9_K^k953$G&MNJV)7M652GzJ*OzN8>>`NeAcW^VHW`xa4$xK z`V*MmAwK%(z%Us~X}tFLgd_5de`RMMfo&Dmwu|{w%N#3#F8svDmsmVV3M8Ju9R}wP zG7&cktbYgAje7Z0T{0Vp$F$P)wz)i~Fr4W+Um(C;fob+NlFvlbAHbB<3v8mk!n$(O zL$o)}_BsMe+2npQy}c+u2;cN{bouNaHXO3DFn81lLSpSLQG!vj z(USreEnuD5ce%nYF_8Y9fxt}s_^w^VUb|zIS*GL;)8*s>PR@iUJqhIklNJ+AYK^nE z&6}dBCK+4X@i)PQseblvW#ehZvMz0&m|SmTEz(eRKA)0Gy?)4Zr?Pi;`L-6hdTuAd zuI4586>5y`G$W5Cm(IiGaGZbD+^3|&lQ{B=ptO?_uk^+@P@efje> zCo%mr4@Np>_p0VSORT0)WPE{LlR4D>OsP55Ik@#3V*XL7k_=yRYsuZ@g;B7xO zG1ZOZ_IjCVn@R7b$A&mJ$sIsxBp>@R>m&cszBge)u!BhdlrV70qHwgI8NRC$$zTo;?Tr5xJRk8W^GQ+~UCg?zI^nm{{ zd6+ml5$r5_;@7|>tzdn>;hT7`LG9}8ccqSjQt}-!mL4O`Zt8rt!IwVhZzS<0VVDMX zS3M-BqM5$%&(D=FQ{UFt;mEu5YFQq_@^&?4sr`;9IvyuHj!^Kw$P8r^R5)|-ds(F8 zw{TK^I#ut9QqT4s20}DRJE8FZ)Md0p>_nndUI?Wm`9olL@MsLoS|PcWcDCuWl+n z%OF=4X(QUebUr6r)A+YqZs0%qf+k!jDHwsDqyBTLYpXrbcachN^F;Q@yx&Jm1v2xC zZLSSAQMw}*cE~qoz7u+KLU|h0k~)yL{6*xRe;FxpZWsqvv(#dLcl}L}4=UWcb%-KX z8LVr)a|vtK{yi7O4gS9JWrR%EYZ_W$Nv;@(5^!rDb4Ak+sUpc|Il^`JO6oaZUFK_Z zHo|7>^g=TZK9=Wx=z4`a>}F`;D!z=@L8HS)->I?pr>2Ky*H^Y0{6~cqBTUIXZac`R z3+p4!cD%hRUW4g{L$nT>k+~#n9R0qW+NZ93-tXqrq)=jDXLP;~zhux%lz+1QFBw2^ zkxB;L#i7e3O!G!wAZ<;C7#NRXM(mZ-ni4u1UHWftTQk9#TP!=wrrwQX zd7e~ndTp7;*c(N7ojc<9t;-L$VgrXegw8r^7heNHy>7#iU3BPf%O(Df&q$1~(hUq* zzBCNh3#i?k%;b%%ifU!Z2zY6PjnHDw061jk7vSE%#-YC5GEk+PxPQ?kKUn$<36XUhE?Ce0T|#>gESsW82p zRN_1Rwqx&2`I9l4UI$2l2K#L~XC)c=$*PBWI=}f0k=#}&EMTBjF3#pHzvt(jRzu=U z>*MC35xsXXmnI~sEh6k;uk=c!ig!sZEL={G;S?1Z<>ss9rac$~Hi-m380%I!#L_YH zeG#v(BkX2J`aNKL$0d3${-rUKiQrBh6HIr4gsxo&@2hsZiknDywWNsfz+1d&WMy*l zBK=Uy0{rV=Wjj8%53&Nm1x^1dxx}UO<}0zjWbNBpJ9En?NgvGi*z~U1;c*2&@ohHB z`tNlQxWowxGSt&S*M`q^ABi6G1h{^x9&dzy=KpM|_}qWI^`R5Ounc|!C#p) zN3hhh``a}+q21#u_Ly23fb|eV=G&@%h_}F5TZF%|FkLAfhQnfeJsX{hD4Q<*EdFUK z(CY7@9JeE6*X*^++$nWo6+1A$I&^Nf`0!W(}uPD?bsJpa87bt=_|nhx(TS3IF~gzyZ!fN-9bnG=hpn& z)HYqKIi)7`_b=97!>VJ%5D(cdr02a@A|jVFzw72ac|K5X3avADa^_6vcEN=FsDWV3 zguLDtjz)X$sCeWnSgG zS9-Jz_1gJv@|>4}fLGoINtL|tG3E`%KVc26-vf1+-Q^3vF;_d?tOD1rVca}&{%rhJ zg|&t}GsR6fh{jwq+6))*_+hbsRF}A3lRwTP_1G<$wL#{YK|g=8xCX*6N_r@9zQj5K z-#HUqLk5LTwl+Wn{x21H4z`*CWdQrY*}+mPtuI-t`rsVVJ{IO$`Rsxm^KHQosA6q% zz`YJEJ`rcAIF=%mQnPhPJZVRP(aa6+=m-lq%POmFQ!+sw<(Ej}@KnGo{7*6IoM(@x zk>qa%x_UffVSPLI++590O`tjQrC59eE)-oH!QLQ0>GD|{c}iMFk7H=q4`iy0lX zP(<_+t%nV&V^c2)E!2Zz85sl^(8sa=1kk;RrMnQYk^-kRzS(Hz|8!n(`*%heRsVZ_ zc6SnCn{vyt<;h2M*r{PnDgHc4^p$Jv{XCY7#imFod*pBUm^-vaV;P&%C(kR!V#1i* zn%-;*jONrhOv7q7og)h(+*)nsysnm%hWOL;piGRsPhp(UK&}Ykh9b<77vNDX3%w zaxZh&?`HjpKYW;0^wc9##uBxNldd_AwNGJ{@A#7PBt%v~h%9!#5Lj5M_#bcb2Sr;w zVvx>q@bbijc<$ZU-aYa0);No=9w{46pH+Za`a3eN!oE#|v7G+caCoR? z`Hd2WYha2hFQ~ZIN0d}*i16cToX7fo(?i{$i(Y$8506-!S2(M7>Rdy9O}F~^!ESLQ zKSH85Iy0^X_&l7@eYH%2dxK%v&5*fh$*w|`1v@3Z@n-6_nwF8vcPO@$H%H= zR46{L4_d2<);pjH(@9r3a}y7l+9{6%d?qjh_k$85miL|kF4_O%YbAT%)WT#)+T{2~ z%0{D70qr)L-_Kk!R8dj!ZPpJx9k|y#lo3SIV)_vW>9NR*PvybbtV`08vVyLz)ve;O zyA096eDR|B+H_E)@J;Y0bT<`CS(88sauhNhKzU6<@R z05l_WcIKM9zpQm|>$0kAE-Cg&O!P(W7?G-yFkeV$4w2M$hGhP*l{}GBD zIR-GrwFTA&k`$`td?jLsb@4DGwax*4M3M1zk@#zAghXL!HXu%`XPGE1F}r5iN)*bB zb}t^}zW*;o6lRG1LccrjS6Ivb&x|?YJiF*5VD@A}-EVNQiM?(Bss3-w8o%&lL_?XJ zX?@($Qzi&f3~#0YlC41kr7*fbw&O)*58z3+r zC!xi=y+Es zB>G#w_Pa+bg=UQ9r-vpf^t^?_=c@2o)mn8KMVUotdy-}XkRUylYoW;b&D^KPUdoaL z(fPB-UT>{iCoqjaR={^AsD4cmSiv^>>}d~#%@WJ>qumUfX~@`5{D~mIaF&7(Mn2sy zw%em7&^~n;$nJTQ@qCJ?Cu3rtX}8A-8U`!^ey0Qq2y&NlaGP-4k90(V#y`NOS(?QZQ`)zw#Br%#>kJ~#bH=gq01%cHlmizU%#h7uGZ(`1=gyMCpe z>JGN(duusf*_)(b`wq?N_u(F79!TAwqVmSp@N!k8a}H2ei(~}LvkN|wE{PS{S+>F+ z%^7TyTTD^m=K#!HTSM(0Umf|+ecRsRaQRwFbcEXPMahAo+T}b{K;Q}XZMp$lY`Gw%_uHN(87>)lj-O> zm-~D_emHB*iQf%jkTH>uNF_e2Nv~<$fa4a^q6JU~BD-$b0mG^s9ODF9Vst%&YWTM) z10Va_Gu~(@>lv>pQNP9|B(#&l#-Y;`?eWmL$ES^Tif;{|HNV)a{!yAJ?DXP8z~k0A zu`xF-B$D(#Rtnj+1PNd8vwQ@POWTB_2=tH6?7olAgnS(3F4S1R?IMch{R8Nc{;`O@ zL_OR)9xxL~(!RUfFKK@_)}P!`>f5D=HAxr=OBSffeEY2U{)<&k<4}LH2yq2wJ zgm9TX%#`^yhFZ|IH)62M=zD2TD*>AP50b#fh5UCsS~h0RETqq2_{yyHw9d3>jGkfc z?#*M1B8oP{tnTOE%q+D2hSBoGN|h?ykl5Pc;$0S@rIT8=cfnyR2eGcoC*X|Im|89# zwc76(T9H5=w2S^|SbKGN%8N$}wVpc&1SU|jnnmynP2hVrVkva6pz&n?*bx%Kw$#w% zZpcI@ORCaSUnEW*;(%3ZHNdVTIBW$r)z|SBwCZa}I^Al}Cm#FAT_C3Mk98ns3|k0O zUHDgSM(ujX+$oEFRGGM_QbQN4sT=GqBm=r~yi?FR=SyFv$a6{F!Pcd4n=@psyN8c~ z7vsdx&?g#b(Kl&(5W2*O!cW(OMiQc&7WL&q( zSC&!P@xfqmOdr6h=%kxZVXc4Tj$9kO1B7ChguJQqIowm^SvbcBe;3bASr<$MRiQmgdq-}lGG>O=nrKc? z|6mH%i=Qfz$oQhE9Sq|r0dpGaB4iZSGUJ(AVo|b^-hGX3K6!R3^2Mvy&Pdu8tN10` zoI+N02w_b6=Q9a~TM=J^Vu;u5+=hyQ5r9qXf9s{4H0RcPNMCLY;= zuxP>bCPLU%if*a&u>-{ZfjBDRcWKc%Md90&s#zy-b6oHOWvVE&7d3L0JlsS~EdXZK4qC}j)h{?* zGtu`_&XlnRLQj8H8@byi#=A>Gwej(x1 zmcsDa>E`0lPKM03RwksTSKICIlbE=LmY}?Gm7naYl21Km{QL$lxDxU(T}C->ikZyy zk$Vf1W`t=h7*E1&&MVY0T=_}L3Nv;<^VOCdLm7=T1^LCUJhBDf9oIPPJp)bCPv)yI zQt#65W{$P=L57e|d1(|6PMWmUnhPUd$3H3fIW*v&&}helJfgh@vGk+fKOc(>@LG|Y zk7sWBl}(x+`*9;0&W$l@)PF%o=~wvi*SZrn`Tc=be$D3rO9MEM*M7pA zpW5)EKcZCL+x#-37EO>PebORn@EdS=O~FO>z@508gUaDRcidELB0(lN?wTc2|3la2 z9}xci=u=0_(!g@n<#~qDr-LD{($wjFUOjv~B>*-yVH-*Eh^Xj<0+ytrfJT7NqA+Nh zV)J};{dM{e5HIM!2`{Pye7g9h38PGX*3l_5v?$hf=1FfBbSR8rVQjnlpjohvDb{!?zu zI;*j$i%oMCvaryA!XWLLj4QcsX$Ns3`*07Dn;C`6eb z)g1~d+rgNTiR55vDKX=sB_LEWwIC-?$TkL9%mS{)}4fr%T0q|?mw=e=^op}D()bjA>>wQJiR^G&-xxy2IJWnBar_IY|IJ2|Qw zs?l}0hz1}^T_w~dF?G*HvvH>`vf|cBy;!k%v&KzJOz^WxdPk;Kz82mNNRBEc?llJ2aTR+16rN~o6Y6Aw zZL>>3UeGHJjQ-ocTz@HZ>9lFZn_?9jEIQ_#F$dTEdXWS5rrY?6u)7z*4`hK3!Kw2_ z^_nwwKDk={)@@+9-r1)uA7mDo1tz$KmLT5jTyXB>?9-&kD$vG6s2gEnp;ylcj6Ai9 zb{3v@o|$((4`@h(w{M%VbLUgQQEY-S0}kIRP3d8=2|HXen2^>ZC+LepMIWKP&TdFd z>G>j9cXn9c$Mq4$1hhqp44fipp}DmkpI7BQ<*{#Hz}!D!EnU;Hm`b3}^NQ_>em7=#D&77PH$@pi2!Be^&e^HSx1ytV8hMNjO|vc~Q&)b-1tlEJ3y z|0Kz_^FhwYY-)wCnY;7!^jM@AHf&b$t8XlC?Apzi+pOmIbbi{Dii1*|MS%elp`5s} zm~;vW`PTA|H16}Va5fkJ{B@dbdcnIoIRqivYlpz~qHHX$>V}XIhm!{-B#6LLIaGzg zYS90ZQ&T$xql5Cs3`GEx(n(a`&K zJ6`?MX$mMHKA^eT9D4PXXJIcS?RKQ6G=|?zRloc-8sm4vM86g1qomCH!4nVd=w<6UFgL5bBzP6Du?r z*cesTr!Wq+dff83at?xXbJd1DWstY=4Opij+-mh)oWay@JzlZ3Gl>oVcU5euQ#Ze6 z06?=OOins5@NjO;@YPoT!sxUA)}4a_w)LVr)=6ZL>VIlY$%-r0$bgiPER3kTubw;w}`aSNMKMNhw`SkHanX|%nDm$2@ShFcUB{jva&2;jH_yQA7856 z*}b}~AHqN!PR~mM-{b%dZ1H$?kHCTh>$0T*EtT2vGtRWe>+7i-{flFD`pZmzaZZ!N zGkXJ+F=p!NfB^ept_tzb2q9IVN3u068ll`59KST3E8QJsrMk4la(ENTOc0CyN`N`( za7pc(zC1xj006dTm)~RMo_FMrOR!E9aIVqvG*_hIbdh4QtZ|NY5M-Mp`n98W=o^r< zJl?6gJ4^j3EgwNsuwj3JdJ)`@Y_o#Bbs2o58)C3JmPc1A(HKXnpng>F2*g-djWQsP z-g_1*R?QHW)Ee82O_^?GFfE^3bEw%zw)2PzvK7J%8oU{RytY% zcee(&?O0As*|-H_xbo}HNX}$uv() zqwy>qQ(7Ah+wOn1@+xA^DeY;T3Tz5W53B(RO$x@^R>L4|gUB|x(7+djj2_q@=1#22 z|62B^45!5K_;)TZ^?wQ|&Q|W_rjZom#tSx3`UXEA=N&fY8hD6NmoDNk*31bn3717~ zYjGRWFKLp8HqeiPfKLRhZ3S8_EqU_24<`Zsm4U-U*&z(s5EgB_;&rn=W2745K{ps@ zr6LC&iDIXk!?zZzIhD~mX(E$d-UkEN9xwNW^M)`|Andw}If#fLR%N8#P@X&cuLr%u ztj%=5yPhv>H|#{layNKp8t!3VPmgIY;4<<+_Vqf$mo5502YvS#oYM+ir00+W z0O`@bBjO{us3+RO;p;!i$=2A9J493Au3m$=Jzi&nVilLZ89a!((i>w86du@}N}ZGR`IOY7g_+v-YoW?@A3q_wF)TGE4jYS=%T zG`fAU1udlRw3@ZmluUw>b0Y>B*SymECp{TopE|b7B)scw8D>*A{P7gAX8NJ)z19uh zo?C+hDTdNc_D&1W)?)0OXQw7J(t7Oce7t>4oS>C1m34ds6cCy$klIl9U^yFRrSxC{ z6`dm`KTm3e+%V?jc>r~T6nm$RTm{mCP`R=D*X+Jhes6h3GA_SHEQ4LrK3blpAhiJh zFp0LI5ypF}IPpBw;)@SWGQ5}S;FUKtslk-ro+(@$~$MB&khjZ3|n75C_B(aZUtC!8k)u-2~ zTC3gYw+}{9V)3j2IMyAu=?jjiRu9CPn&}N=hmBRbNdTT`BC*aQ7qdxz(`Tzz!tgRR zke>^oQn^jFP(!0fELZT+{A@P=k^^u6$K3UnNAe9Nf5g|#GHw?G1j|^RJ+{);d$!2^ zrb|%3N;qiJua%8A;OR=F;0kt0qrrWlTscjZNYLuGT|7UusnULb`FJ<}82-?GD*LnG z6hVzuV8T(;9*;bKdTPwPS>UaFwIUmn|EJ~>!6_h@GM zVxW+s?|lpF`M3L618vXyEpNH?KcxGmZrZFlZM>#^E~3nXlBzdHn;7iny!K6m3JZ=n zzf8H}tzWu*iM0Y;gHTx60>RcQsj27wL4F@OxtKq#%?Tgl)CO3C-LZPsG#Ge)IR>O3 zoTpC#$jv`O;4YGp-dkQi7)J4Kds>N&&pwoI8qYtT&g_A0ElgBFw>o7wC!x~l&}0)~qP`oKOEF`h2)NkeXJCZQ8qwnXjz>5eMMs7zJJ^g#}`M##h_p(c3s zO%zauFE&B9YyFy(FgVH4AnTQnZ$xd(>eN-3?GHv}K+m$?uj+3^v_APpxEv%KSZyu- zjy;`RW-16LztnTOx>(@Ck9ri9mfCF)n}&M`gU~&*?;G9W=d7CU^fiQC+te)}*tn*1 z^-5%YsHOe2>Sn`^*?m`}TXW>s{SP(_$rm<1Qj?SV4WtN3@6sC^ag+ zUihOd@OVdW+>vIdJ1YPYYXl`NZB~l|p`P!kX}m#D_e+-+uq-I(%-D_BGQ2mr6Y9Sofmb;TMK1GrvE|QZeX(lHhkmS<=Q^hAH}=9) zY|p{nI$8N~8uroFnZ%)mMM@|t+M9Gz7HXACJ!42| z%B1QTYeL7I7>uF;(Z>ekK z(D|Ixo=c!${t@vJs0jwJb`PUpHKTD>UI%7whdg0B|a&>UE`ixrF6;I`6Zg7d^@${ngxgh`ur7gmBa;N!w!)|2Kk1j7@gMO6IG6 z`Qaw-=Yh}~iGloluT-7$9+X+6`tItrq%!n^8-ptif#V8z_?e^z!@{;m9arKVv3EP55mAcaU2e zt>{F6j&HFv;+=xvex~zN2f;5*+op(q&qLH`4lQOD_UOEjNHgpw-^o?^D7LJ2ISyhY zjW+%blAnj|!!O3Sa6?AAu2jrUZMBtd3uqiDLt{iYup#?|iDPY=TjR_bl-l@){kPGP zGI;D1X2L6vwx0)unvvAR#6sn8MiwCQE@`+t)uiI3?o8iN3&?wXQB`bnQP==AMiDFd z`T0iPU!|0}ir|DqkOFFP6rGCcB)oSyMDq=6u;e2uo0z8X2F6qO3k|DE%P+es02~2sSU*UVmXkwos19oCCfk6_t{~t#oZmsPEypqFa$crT6*9oxs#1 zRH_b!mM&os=k-zxKY4HKzetW9HiVgl4?jmOh$g5w*3;rUOdjdT`PVq)2>#x_4B~v+ z`dNsQhI78`$1s*=Tf&e2hj2ia42UI!G8oGyLv&7VW>LZZ9qL=~tMJ#U!*=9!?82}C zu_E70&;+BF50kYj%83-k_Q~WStnijWF*cD`H1|(hO)a44f)~!q=_;{982I)1MA|V+ zDvrt+PlqM&4&EUp+R~`g^=3u4)BH4HhDA>NQ&fFo5Lc(Nl*lsIjWgZv`a<`amJ*Hb zK2-q&{XxcQu@!RNzLE1Z6DR4gyCIm|{EY)%#clTHl=U zUQFSjdL4nE0)Kwxy}0=B(j@6Unlh8%S)NB7<9W`6M{NdhDL1^ci95`Ur0YGS{do$% zjXNFV)NoCQoQKX=-RKu*ow8g zhEvV{))l0t0c(b?N}D*FwW_?H_U101WzL0|_`T-Tk_p?*gClrb)MIuQOmLe5d48^yR0= znD}g=*%n?5HyG=fWxze83Aon)x>Ws7zb#(ff69vN-mAUPe?AS_aRM--AFl=fZm7XP zr5;G8RHYh;*5X|DN>izB4s%f;8}nRh58!`var|Db#E9RQHW(n5;{C+_y6~*Q0v*>a-0k z^aO1suZ5Y%kkTC@X{g_6{Cn0HzMbP3oY((M@$pK00r(Y3qM7e2I|ZsuM+-tmFM?lPL#+9uP~F+;9=JnY%(iZc?5Ri)P{#c$r0TK%PbMQ%B`G z!gZZ9hOC5MQ5}ya?$t*!~ z8D}sv6QnL_CyGC`uPzc)faDPEaFEzWch@HyCi+@2Eh{~ZUp^Dojj&u(I2_PG)#>NY zvIx|~aD%!bs&a6&`7PD7v%$VRs5@i5LFww#y>x9Oj6StJens_Fg8Qd;tXU29SclKk zIsz8~;&rK&Xd6eI=K3(q07aT3k=^t9jHC2i?a>hMn6%JkmqxUF_~kh)P+?cIAU(b# zX3$FRi}c_Su_i1(jw-B|uVjNB&PQVFO+(vw8_Lo7;U;vS<7;BuO@P=}qhICXHt)rb z`)>i?yM83lABkAem+VN4Q`2|Ukd1e@Yc5w_8}Y5RNoq@1mcxp+7^%$sNohnP zjIE7t%2Jfsj#M_s0lC@}QR(M>{dRox#y~PLB@#uIHh_m*E}sS6-LUADIYnq(5V}lP zm;AXN9*rK>LO2G(SUWU|f!OW&she!ZN$~3JTQUl6no?ybXehLfGkfSO^O5c{-RjL{ zLQRj#cCG5RlIwZbrDIoL+J@ukMOg6-V7}wMD}D1*s}d|U9Z%45Uw+P2sC`JF)0#aJ z>?3-_3Zu#gTEqc*;c?vpq|^-Zl6m9O{5Y&jD-}J@-&W0&?WrY? z_gv3+2>c}&miwH53B#Oz4meqO0qQ^3daRDddI!Yfzp`%pJ%q#7xzOp#s~!RABDzLX zj&kcbIjfv3>yvE{t@J+RgzR&=51CX>|I#0)yd1jqo%SMUl0CjBcZUHM`DeQ>8Cjz{ z;eU`H*nCWk)UTpnfkv`~;mBh%G+%jxOC8yBVj0n)13lxn)Y86eMHvQ9m2*&+%pVzH zW)Q!sshD{!5A(?S6FR5}^Qc2e*M{k8lVamZY}Z|uWT6*yVcI-ab0JJ?9}Ji2O1}lZ zPD#k}dOxU$m5q*ARcO5Yqiy1-!YnXu#S-gz{(wLh@+ikgUe~|P0LpI{a^iRXM3rMB z%-D&=YFs$JkevNbXlswBpPyUI-{!#RP^t>F+Jt)v>bLn}^TqY_@AL)V2}d{z_su&Q zRcx}t=ZLBL0>t{|Js$k$!SK3eCjMsLGFG?baO-P}U+h;iQU*misjeUF-Ca&So@ z;g!an7B}O4aC?hPVjlGP##xi@j^e*e6|b6-A|3iG4eCn^Wq7Ody(H}7wZGiGHLLe}tF0!m6 zlznE9n_x zO+HO#5NKhb@%C($=o^eMu^#acrqBD3)qpjHZ}y3X6X$8DUSI8TcY6#1>}CP|6H;?Z zSC;T=cey!YSD53j(*w7CpEw8m30=tR?<_du4SLiHgqSC44`*eC*46J=Io>y6c}ql2 zJ81GbebrQllm;;#V*f~AhcGvRYa+G3t`lHkxL0Vzm2iHDP^Vq=x;b4IWb;4|S04hZ1~vcJ=!knEdAP-)5JO3CuRN_y*YfKsO>&z z2APs8?Pj=*xly~^n#5*M0s)GgA~C@q3xg8q_{&A=lG#B5*QadN4t?j zk=C!?sGh%&h%$qjHvPmXyN&kt5=*NFLC&ICr$Lc@54Z6Y8op74adU&(IVTR^+*6VroT~NrY&d743VZ zz?H9b99Kv@*upG~#|J$AHj)+ErmHgG*2kDuP7i3Thjr0XiB~{(K3Ib>rI=nFBR7MH zz0?dXJ1EgMhkN@0CxUMa{kPE_H`)U6AHJKj9eL(fPI)AK?B?qp?D5g5)f2?N>M@`4 z_VHU*(R44DMX$ZC+qKB7k3B@7IDPtL*zw$WV4$WC(t8yMIY@}+`Fp_3IW|J>0u^b-}L+aZg~&*;S_fL*=bb z;zBWCF#)`%ji%j*)iHA#k_$&aU2iPPlRSE-NhD0vdFIOfN=Re`xR#MC`8vlwuVra% zQf*fHi4OJcr(|n!@)dw3mBGUA8eJ?2Lk(TWQ(8U)B-qAo8NN2lu1APam5hSoUoTcXLSat!)&eU$1VeMD-Po=OhI^Td7-3uPe#L&*tLK z?T|$Cla=IresFpz&k%%%N{mqcvk%lowhh25`KMGBpK6ehn zkg41rm((nd5<&YkUdZ(F@9M=O!sv(PbXRGN+WA>Au_PDI5bw`zv905g&csAtoP!e_ z_uIej37#i%g`AA2qJ7DwB*Y_8(^t;m#(V(kl)ZE zhrX$u>6@=YZX`yn=k^>K=+vw76O>M1s0su& zb1Wdsl)~HyT3kZ;-^YHTr@fN%50N_aq$!hLzM!H7HC%}ncOO1NswQ8&sPOFXZL~MP zNb|j(C}Gy;&s-xvO?7-pxi6HawfTdem(Ri6;W>XuMmn6UGub)S{MX!7Xi6=4&_M1h zk)su!shX!Dkz?%V_>M(a{0T0eqNS@86_C*K{ZXLxV)gz+Fi`u|qdGWOF|8jf%>1<_jRKMM(A!*{^iI_BrvM*xfgJ*UZ`y3jHAFKI)$D z5upUi8>fJ)_$^}F9p1xj>v|E9(9{*J75toT#TnK@qDtiJRnH-&NQ)a`;{&;Xq`hI` zsp#z~xiXAu6V?|z__g2@)wFY?Jf`3}>S%O(cr9C`WObymQ}mzhkSAX0etkoqU%WJBIW-{-gx(Val!9xNOBsF0*%s_!^*LBTaOcg%`QXXG zB-5Z!%rE`io`4?tVnDV7+mu+WEOO6m@J-u#WMH>a(wg|4gnkrT} zxLmXE{XjCBVw;w7nPQ2vD3)qoK7T@m3?=Ew0H+2mW~PlezTAI~ zC9q?yw0|)Xoa`$~iI;e^nB*dQMWOQipZqd&nj(*jl9yueQcBisY0ao3>Ghs`cw&@@ z^ydXT7r_Bq7lH!Y(dpKxD>B=oqnLraZUR{)A*LKYBjxLFsQ6DiSJ%85SNRAW%R?tJ zBt(^b literal 0 HcmV?d00001