[prev in list] [next in list] [prev in thread] [next in thread] List: fedora-directory-devel Subject: =?utf-8?q?=5B389-devel=5D?= Performance discussion From: William Brown <wbrown () suse ! de> Date: 2019-11-14 2:34:32 Message-ID: DF598076-E283-4B8B-AC45-C7D598057F16 () suse ! de [Download RAW message or body] [Attachment #2 (multipart/alternative)] Hi all, After our catch up, we were discussing performance matters. I decided to start on \ this while waiting for some of my tickets to be reviewed and to see what's going on. These tests were carried out on a virtual machine configured in search 6 to have \ access to 6 CPU's, and search 12 with 12 CPU. Both machines had access to 8GB of ram. The hardware is an i7 2.2GHz with 6 cores (12 threads) and 32GB of ram, with NVME \ storage provided. The rows are the VM CPU's available, and the columns are the number of threads in \ nsslapd-threadnumber. No other variables were changed. The database has 6000 users \ and 4000 groups. The instance was restarted before each test. The search was a \ randomised uid equality test with a single result. I provided the thread 6 and 12 \ columns to try to match the VM and host specs rather than just the traditional base 2 \ sequence we see. I've attached a screen shot of the results, but I have some initial thoughts to \ provide on this. What's interesting is our initial 1 thread performance and how \ steeply it ramps up towards 4 thread. This in mind it's not a linear increase. Per \ thread on s6 we go from ~3800 to ~2500 ops per second, and a similar ratio exists in \ s12. What is stark is that after t4 we immediately see a per thread *decline* despite \ the greater amount of available computer resources. This indicates that it is poor \ locking and thread coordination causing a rapid decline in performance. This was true \ on both s6 and s12. The decline intesifies rapidly once we exceed the CPU avail on \ the host (s6 between t6 to t12), but still declines even when we do have the hardware \ threads available in s12. I will perform some testing between t1 and t6 versions to see if I can isolate which \ functions are having a growth in time consumption. For now an early recommendation is that we alter our default CPU auto-tuning. \ Currently we use a curve which starts at 16 threads from 1 to 4 cores, and then \ tapering down to 512 cores to 512 threads - however in almost all of these autotuned \ threads we have threads greater than our core count. This from this graph would \ indicate that this decision only hurts our performance rather than improving it. I \ suggest we change our thread autotuning to be 1 to 1 ratio of threads to cores to \ prevent over contention on lock resources. Thanks, more to come once I setup this profiling on a real machine so I can generate \ flamegraphs. — Sincerely, William Brown Senior Software Engineer, 389 Directory Server SUSE Labs [Attachment #5 (multipart/related)] [Attachment #7 (unknown)] <html><head><meta http-equiv="Content-Type" content="text/html; \ charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; \ line-break: after-white-space;">Hi all,<div class=""><br class=""></div><div \ class="">After our catch up, we were discussing performance matters. I decided to \ start on this while waiting for some of my tickets to be reviewed and to see what's \ going on.</div><div class=""><br class=""></div><div class="">These tests were \ carried out on a virtual machine configured in search 6 to have access to 6 CPU's, \ and search 12 with 12 CPU. Both machines had access to 8GB of ram.</div><div \ class=""><br class=""></div><div class="">The hardware is an i7 2.2GHz with 6 cores \ (12 threads) and 32GB of ram, with NVME storage provided.</div><div class=""><br \ class=""></div><div class="">The rows are the VM CPU's available, and the columns are \ the number of threads in nsslapd-threadnumber. No other variables were changed. The \ database has 6000 users and 4000 groups. The instance was restarted before each test. \ The search was a randomised uid equality test with a single result. I provided the \ thread 6 and 12 columns to try to match the VM and host specs rather than just the \ traditional base 2 sequence we see.</div><div class=""><br class=""></div><div \ class="">I've attached a screen shot of the results, but I have some initial thoughts \ to provide on this. What's interesting is our initial 1 thread performance and how \ steeply it ramps up towards 4 thread. This in mind it's not a linear increase. Per \ thread on s6 we go from ~3800 to ~2500 ops per second, and a similar ratio exists in \ s12. What is stark is that after t4 we immediately see a per thread *decline* despite \ the greater amount of available computer resources. This indicates that it is poor \ locking and thread coordination causing a rapid decline in performance. This was true \ on both s6 and s12. The decline intesifies rapidly once we exceed the CPU avail on \ the host (s6 between t6 to t12), but still declines even when we do have the hardware \ threads available in s12.</div><div class=""><br class=""></div><div class="">I will \ perform some testing between t1 and t6 versions to see if I can isolate which \ functions are having a growth in time consumption. </div><div class=""><br \ class=""></div><div class="">For now an early recommendation is that we alter our \ default CPU auto-tuning. Currently we use a curve which starts at 16 threads from 1 \ to 4 cores, and then tapering down to 512 cores to 512 threads - however in almost \ all of these autotuned threads we have threads greater than our core count. This from \ this graph would indicate that this decision only hurts our performance rather than \ improving it. I suggest we change our thread autotuning to be 1 to 1 ratio of threads \ to cores to prevent over contention on lock resources. </div><div class=""><br \ class=""></div><div class="">Thanks, more to come once I setup this profiling on a \ real machine so I can generate flamegraphs. </div><div class=""><br \ class=""></div><div class=""><img apple-inline="yes" \ id="7C7BF4F6-4F51-499A-B125-9095041237AC" \ src="cid:275403CE-D881-4B0D-ADDA-60EBA46AEB10" class=""></div><div class=""><br \ class=""><div class="">—<br class="">Sincerely,<br class=""><br class="">William \ Brown<br class=""><br class="">Senior Software Engineer, 389 Directory Server<br \ class="">SUSE Labs</div><br class=""></div></body></html> ["Screen Shot 2019-11-14 at 09.19.31.png" (Screen Shot 2019-11-14 at 09.19.31.png)] PNG IHDR : 5 P iCCPICC Profile HTSiH'&HRB7! $]G`DEСcdbXdQ0{v};? %T p_zl\<7 H @Yl]. hjk6Wpl P9bv: 'aE v \ )@XAp''N3LD{" b ;=!#l!veX!<?==c \ l8(b%Kyi{ 4֪8Ifs J \ zFά75#@ʂYs'e3~9, YN0q2{G̲(#\+Iɘeh.$5JjqټȘYGϲ85"`SjI \ ssy}/)ݛɋΚ+`Jkp| \ Li.aZԟ+"{3rnoSX7D:VXL̩F<3Dd^&0.)`ϧ[YX:0u_g>R \ 2`߅9[ . ilH}r^ %] "E*TA~t0CjH6t \ +|e u(8Zp\7mp<}`# Q iA)d9@7CqP \ CEPTC?C5zC;ɰ`8^g9vE|_c("P(3 \ G%Du<T ՈjCuP#h,h?t^^.@]t?zCcL1N&&YŔ`j0011X,V ka)>l;p*8S. \ erq{qGpqwpOx^oMa9~@%!apFE$L分Db$1XJl$^&>!'H:$GRO@*%#]%>&dOb\K@~H~OP(xJ&e;rI&c.ÔȬ)i#F \ /ː]*-["{B@5 zRYurijuL&g)".W wXKy<G>G %Kiihi \ XCBB Q.QEyEhŕgPJJL4BJӘǘǝm^;ƕՔݕyMUURUv<UEPݯzYuDMAYv\:nZ \ M1 M _ ^K#J)Ś4hZZ|bZt=^J \ jkiK'tut64<%:&ik{Ow7041jbPِim`Ĉbfܨ18xmքgRnr633힏8_0z~ٌae`odhɼv.\ \ "cKyKMmLVV)>[ژpmllڶ~5 \ 'W8(8:8\u8z8w<)ӟfΩ·_.4\]xhဋ˥ʥϕzMۍV]ם^>0f \ 00xXx<Ny{:y.~3k/o_Sf3Gw"ۂ \ ]AO-! +ia_ aaa/ \ -ׄwF"EY8(J-8>z<+(/vAqqx\|t|M"E .]%+\[4meXN$`b'|eYcĊQ'{5ǝSpCI.IEI/]w%x%'6/2e<5$6u2-&)~Z \ /Htdhf s}˝^>* Ո!qk2ݔIH\ʳ>^qbJʛLVm[5jj5k6_X[Z}|7m$nL&ME>lܖ!g`\\QnV筕? \ еzm8y-Khc鏓ۓw߁!`κ"좁]Ayv/}ĦrqdO_i`i \ ^;~-/(oPV1~_VV5WT:PΟ~QɯV+먷?~ \ n4Y|QfUMJM1ɱW?'x'O8E;5jmƵv?v_jh)?x\ι./\L8оK: \ :.\zʥNF.W\svv7o<캚ojx{a;nw.{ލD=Y \ }0GY&oxyߌk;y:dHk3>÷_-z5Zzb$?*97GcGߊN+x͇бg?N}RTs痘/C+⾖~3=I!KĚP \ II 6 E3@3 'zd75l p( ?Edm5Ԃ&%gɉo5H qf ZDE^ E c-@" VeXIfMM * i D : \ 5 ASCII Screenshott iTXtXML:com.adobe.xmp <x:xmpmeta \ xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> <rdf:RDF \ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description \ rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/"> <exif:PixelXDimension>570</exif:PixelXDimension> <exif:UserComment>Screenshot</exif:UserComment> <exif:PixelYDimension>565</exif:PixelYDimension> </rdf:Description> </rdf:RDF> </x:xmpmeta> c @ IDATx|E߄$K]@X@@i(FbîX@ '6D,X AE \ Ti*(E@{O晰^+$wg}睲Q6儎HHH"@tDHHHH@ \ Ê@$@$@$DlR0 *:$@$@$@KN-# \ :@$@$@$DlR0 *:$@$@$@KN-# \ :@$@$@$DlR0 *:$@$@$@KN-# :@$3GIH \ P R`H ̝;WW.K;wxn= @<"@`̘1Ҷm[ILLJ*yEo \ =TtBL#9[l&MHB$_|!?fH< I \ \r%2m4DRNy%==.ݻGz^z2tPSL~ƍK.r뭷Jƍpk&[ \ 1IH7ko]"/[N}Q9v옼{rIˤ{2gٻw<#riԑ#GdʕҫW/iӦtI+I> \ V|n2 X$@$"lʅH^ \ ,{W>{J&M,9ƍYfɟi_do^''O(5_}!< \ C)1$XaCPںkVgϞ+? p7H \ p,5,:SRRBST)i CFIʕ˕+'ё @$ \ HHD`ҹsg1gsñ 㵢Ϙ6v8< \ {춅}R p$oy8ڼylܡCUo[oٿ<Cb \ )RcBE$@@N"E 3~XO.X \ `80f͚?Ȼ+E6CG$@H"T)S%5?W5$$$M9|`1 D*GjR<M \ **JUf L2$ H H(E@ $@$`"+ DZt"<) D*:UHHHD IHH" *OJC$@$@$`"@E$@$@$@ENd'! \ 0'OlIHH 2z뭑!HIrP>0FvvevF/ H/?R \ s*|ˎ9' B@& _Tt s /x` %@E'|ˎ9' \ B@& _Tt s \ /MìYr/8/˜9s\N[v<#}vp$߹_ 'q՝SLO+Hܞ:tHF2Bn4ZmRͣ|F$w \ oO>DΝ;g"daBr`s\dL+֛Rt`'ԩSұcG-[o%;w3aY>C}W~[X+jx> \ _|tY?;+,et!CһM>EGGM7Y݃oWrQ.&%% \ YٝJH![(aRt222M:O6n k]#j:,sΑ}jB \ ʕ-Zȥ^*lX^Y8?sѣGnzҮ};Acyf?oIʲeKK&Mtƍe钥$7״(ٽ{_"_qo>)RN 7s_l4jXկ ߴɩӧٳWkeWWN>(͗YJ,֖ ,c˫SW \ ^!OyJl6ԨYCTkڅwH^=uy^g?a8gu9sF+9M67-C/Z?%%%ETuh#K \ Jy~0t,ұO`(jJVR;yݻvˁ4mZkI%aՃ"ST)tYb{ymGyDI5#ҫwoO2ZXbeѢEK/amw8O)I[l*UH +YRRE2TppڵklY=תry ݕ,[4py=Z^Y`Rnw~(,cE%%9EU.C}N<(͚7={Bv| Â{~K[Wv(N>O`JJtEu.YϰeD/ ̓?mذ![ @ # \ SsVJݻ?5k*J9qt{yyǥG:s8];AG}$67AǍH(kϿ+SZRSSe;Șwߑ}Eޗ˄/>ǍSuCkV;yNKN \ "OjՔrV?\)SFoHժUnF*Wb,õٿGϞx|,cL|ZoF& \ H=1f̘Y>Q(Ǐ(Ū~#{'zRZn-Ǐaj~YD}Ѥ$s0#eLi&W2 ek\TJ1ytݹSrRGn̞=[GO YٳG }5jhƗ4'~04nX ]vYmбR-R2/6p#'[+ȗ_|)դVXxpr$j1_^zay嗥lH)6vdõjug>L$˗-;ܡ lܝtPu7r \ fPx %fꔩڢ czj7Ȯ]t[Gt&(RR.\$۷oWe sjWT0/p'sqgo(;mF0\ka='2Rd4;4ĨhJ/BW ȆUs0`?Cɜ9yŋןڵ?՜d1&!|azSp)WSB""Dy& \ ƢqeXQ&M$&OeqfL@TRx"ۆ1hbc39Ld \ %&ɪ'4<5D5-O!1{[$w&{Ln1)sEozM5_x>}Z-A0di,!9Xu? Wg.[WgjxǎҢepO+F\I \ _\2'c.?{wՐ<W`ˍǏˇU>L en E= \ gNQ#stIO*~UŸi1 \ %J~Q#KgVJʣjm[ɐHɒ%2\$ȱA54i2QأjЋ/ \ #WW=8*VC:v̜&ZXzuP曲g*ӑ.dw%U15/gĉz}o)ac?& \ GzXFV֍j1A:|Vzl8X'Mdmf(2U>=n(G8)JOd%i&=;U(oyulXF \ (,5ϘXMTOM%HpX:X7*nzz1O<!uΈI2ja˯e~9v@Y̬$=-]7 \ ղpt.$qo.|aXV{?pKm;uylBB[oYta3G \ ݦ*`'8=1Ƭի>oTIٲe|Fj1&gVaWf.%gN& \ ƄC2 +pPp|)?ql)YHː_"8TtkT'ɟ,6gՊz<l=ʅڷؓi \ <" .TtܐEo +0mx+a$@$@$@ f2kC$@$@$@Xa( @ \ ƅǬ X9:x D {ԋr@H*:qU՛ O[D/H/?d* @ y \ !@E'w$@$@$@9@N@%HHHr Ϋ *:9 \ Ttr;J$@$@$gf͚Ɂ|:kŊ2p@iݺw}sNHK.ҨQ#0`ٳ. \ ڵkna7tlڴfuҥKkr%hG`K/ك>,{NSNl2{?VyIJJ!CW\! \ oI믚 ?VvyGרN2|)yK/ٳaXho'|bߞG \ 2=zT $7:/bƆ ͛XɷqFٳ7,[n'k%Uݶ't\GGϷI@7gΞ=Rv(?=)-gO2 \ /吒"mڴ+Wړ*w{$u`Վ~ \ D9qdddx=kݺur]w _~AhټN:;C?ZTkm۶2}tT\wu:<(CPrN6mmYbYxۚ7"snݤ@K~sβ~t[nǏ˧~* 6}k[Wl + Yj;&|<zCCrN7w5j<$?2DGGѣ.7CYThQ6lSBs[ɇ \ `(5kt'궧9Q۾}Hww^OZ[5I@sΌ'bbb߸N<9 o=k9 \ 3_ [֎~wɝ=FdW.hJ(ʂX\ \ ?dh${7(zW_}@1ٽ{~ ,,0UV^zٯ.OϦM \ 7NϤxG~z}HqܓO>L \ F#x衇d̘1ޙyxჇܻᆱC}xGܖ-[tO8]_f̘!뜆VyIKK5k \ z/_>W'>ph,Q{=S~䎙s>[}ꩧܐV3"ׯ/f@ĉ&M8'cJF;a \ cN 'לz,k9 \ TZ1ڵ+|_Vs4_yB+UGPƞvB\箎"ҢEdܹR\9A'!gU(+MO2@ \ p*WXϗo+|)Ea!ϞʽEF4H0b<6a \ AYAaz`?6eCϟ?$$$ȗ_~_Y*0<|zI& Lٸ^u:WnF0W_}eYN\fYdoi J@$)9N=| \ {Ca; 2ăsIvPTbcce۶mCjˇ 4d8pyX \ eQGPJ, <@9/ D]RV;QQQZI7}(SXرcHUFܳ>F $P a(R aYɇa0õD yeniQ|3g S:vkVed@ ! _d@g횯Jo e@5r7+:VH07ua3tzj=d-zh|: e =*3zA%?i`n/z'ĸp̙3k͈#tk@z.C4xC Fq a }UW~A~#ѡa*X \ O>k kݝ~+˗/Qnv7OgԩZؿծ][CǹPl*/P:05Ȍ. #Mwbnȑ# /;`mOa@4P`逃Us\룿JF|k`XCpl`׀ AB' \ g%Ggl7m#owu͛v oX0]lYNq`Uh~nvVn F4_C \ l,:+ԪUK7h fdM8"L7OЛ<0ibh' !8#cp၃!z \ P`U@$(? FC/1>1a(8X0/\`)"7zhuo $P`(ۧ(P8QPl ';C䏳,:(gX e;Cu Amk;ٝ-xHC(PesEfZVV2Z7}ѸQ< 3XĢN LFWg%l텑~|ȋ(ӹkV2 CydaXVt8+(8 \ }7r7[;i@(:e}GZ@!h j37Ɗ4`. \ ܘY/\N\sǎO?iq1НCjԨ{F㷻 FOr`^5o\+9? \ rwb330袋olP(AYbL8P?9Oy =Ts+_b\/CUo|[13+::bx \ ځap2uV2ZYZ5*#:dO0?s`0l!PpD1qSbmVjQuz쮮Yq@3ż1tvqV2XX [!t<P9~:_O \ ]Ϟ"&Zg!,X`Zl0`U31/V 8<(xNj0ҭ\ǎ֏^4n"@z C`6"HrP2x]Z,( \ VXt Agunc,U#>pO!Au@0>"2%ǘCFyXMxgX!+p%òq \ 4.]ZӢ e27,%׳វʈ C*a?,qƼ р3,GqV꧱ XZj'{*_e譎#U\Ouͪ^ \ YCqm%U9`A6,5Z;kS;i#6cy \ &"(Xɂ`R Vn!f~(I04da=iTt) \ s~No[o{x~P1p5a<!?Tp<&X2Cxx`ͳrP|0tP|M's \ L>IFA>;X \a1imqa~9,x(Ai %ht ?JFt_5dD^\:2X'VWtp_YWLnA) \ VaΪ|=mg筎"n0fUFn \ #wdMrt=onϪ FG@).'O:=fTTcɈ/zPp~`(<`| xh;o \ ds*",V0BNcȈP,h:Y&8( \ xP:Hu9@5ܥMv96&tcq0d'}: P6 \ ؚͪ|P"5<gU2dWIsy5*ZݜGO/*< \ $;ҹD<ΌbU%WJ;6`р"a9?J0`8+*/opN8+I~_eXY]' \ @y>$Uvw$<zt @[ f4_#6st'2S" \ +䕒$@$@$ PɃNIHH WJr @$@E':E& \ BN^)iI$@$@y@H!EFB: 0_ \ mBr.t@щ4/l2Ri/I@F!Ϋ *:9 \ Ttr;J$@$@$ d^HHH wP* @ y \ !@E'w$@$@$@9@}Yi֬8pRSS;/ \ YfM7$[|Pv?RRRM6rJ{7n(={ƍ7,[n%%%ɐ!C+[o{ҥswgΜGyD.kdʔ) 67ڼy=߃7xC>[zxZ~9ڵknFzi&tݥIy?a[]]UCF5}u`\W:6||C \ {'M;m4{vOVWX6` ٳg={*M{r{SNl2|Y^z%^ \ VYݟΙ/sW_9Çes=NHĉtٻw<xb/">=zTj֬)s pvPZ/Ao4|^zL>]ˊr-rqOaÆҷo_l:ak=V;_VZ/Z>HB Ix˨QtYSؑ#G믗3fHҥu#s^{Ҷm[ͥRJruٓ= \ ۷Mz9*80 Vkѐw \ 2ruu;(+V4y=~<SN4Iq)2: fٝ3b}!ڵ \ N@rrΫq{*M\|~֭(P@pBB~q`N'O9 oV \ $(9P*<.Sgmo-H.Ȟ0!ԩSRzuA_D Vha=&::S?dx \ %Z֭['wK( \ YܹSV*z_C:|>}Z9;4*Pr94j2uT)Un0.-wi5(nѢE{+<t \ 5kt˗Oիl+&Mb'ŋɹF<<, 0^+,9vɕW^\_='L`;x \ 駟tK믿.ڵKرc!:Cɘ1ctPB)Mk/+WN?VaxƱ5=Yoʕ"Ue4 \ -Zɹh?{7ԩSǞwu mn'j˱Y?|1>Oiyb#(p"zqzJup[lqqq]F[O?mW~Xϙ3' \ 6RCF-~m;AÁd5:?C@(:!1 A \ QG@sϟ?$$$4ٳ?X \ h,]Tx a O<(1</b e8 gq-FψsUWzfqH"has4:Crܹsz|QF%K%&[AA)B_ԍ S<'<<(:tg}&`!Bs4};VG!&Mأcu<(0d 37PP4퉝?/lkz *_<%5ˈ:hS6_pX)с2/确ӄp8F{ٍpwP<ƫ[Ap>@H"ꩻ{4y} :nC=6Q!i#?ά Ucu3 J FC 2=a3tT!@ ($PV , Go xǘ[/k̋V2%7sL \ ?^[mF-\PрC%Fzƃ6 x -\JڵI1xec< a ,(De儇<K ;ybnpli8G] S5L-/YDe?UʈO>k k{vg) \ [/.7yS6{#G4 ׆KP?&Yv#ӷ70=poi",Xga \ ~.*-[ܱ*?+ݟF,<n[j}<:]acсҀ)XWU~aB Q \ í_^ڷo1>4r8<Xp`iY=za4 }iS'$㙡 -(8"2 &zyFYo|*ý;RZ5 zes$` F`kͽ1#<;Q`X/Cb C\~ڂapqV,7dx}Z6/\\ > `Ʉ?YvB 6GK=ŗ:Sc(yPYqX[|{?yDhљ6:GG3(谡=|Ma8t5+v \ > Ǐ=wsyo̖( 0upFdA.2"0c81v۶m7;sy/_^Q^h8#ir>傡G̟+ \ 1frPLFE]4L͛7JPsL#~~[o0d*`1Ou{ \ A:8bh <G%E]0g;[6,Ha?:A4(e1?(`8t.0>+kjcO9 yeEc^Qvhϡ \ C)tC lNLCXزeKM aLP`&Ã4ر~ JcH\ѭ%,Dy \ |yBƍW`8<1HZKn`/,tU,8 g?~GqzL8b9/DO *LXz95 g*Q9 +dǷY \ $QAv<xsztnr˪|!UKX+6h<y;(CQXBZia \ gβibb<:p=h&1d1AsӬZQ=*?+Oa/h3PpHO0AwNRhh \ QԿ`zX5LPf0g 8=!1 $a2 \ E|wxcz?柸;?X*;I|nc82e2 \ )6D#aL9-4PDPfP0\S9<>m15cP \ 8>,vxu]zAN0Eca#51$: a;d_Vܙe7̭o \ 7X2[xn{ϚCG= a1[oy̎k1t0ԏ:8t"̪eCW\|M \ {HCfP<V~{=ޟH,`9#7Q'qIcƐ,a1RTFcɈ=|;?\<wߘXF9-wq#"*:( \ XE00}AyQ҇;Cbڈ:<`N#Ҵ :kSF \ א?Y`\#;q b?gaVGXaTU9g{*M|BaG \ ]qgwy9Va1>5yN&S,>JaEpw;?X#s*8<}Qrw \ յݝS~!pwV,=oYkX9nVSt?'~{+?O7O`!6strJ$@$@$s1$@$@$@Xa \ @8 ΥǼ X c$@$@$@L \ $3PHHEsu!d]$@$@$@$@8tŚ@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KN-# :@$@$@$DlR0 \ *:$@$@$@KNmj͐d~pppk֬f͚U߿\q/ʉ'|>sٌdYp|| \ ~<\s߿?iӦ4o\^z%IMMu-1ua^l8n>2doXSM&z%. \ QZZʞ={뮓W_}U"C~[1K&yF-?5W~:6I4R*aӧe \ 駟ʂnĉ2rH4i(P@Nr .^߅ 6S,N䖋2ش⃰%ݣ%>7eg2}tlұcGԩ& &Ȇ iӦr-H|tΙ5k$%%I-O>yRD IIIK|A;w#z4l.|WRP! \ z0 yݻ#ߡK VC)]XZˬ[KO\}.UP{KttfL.L{?[oiˎ9I \ 7p*7 MɄM ݢVA\o~oY.b1{lҳdiԨ \ Gz~'ի/_^+@>L<Y͘1C\^9uꔌ=Z~ZUW]%+Wq>,hׯ/;v쐶mJzzK.\^~euEtIYpbVh \ Pc91`AĵrPOqbO7x]M6I y@Iܤk;%KN 68߸ 6yqUIN۶mRJI=tZ֚s*NŦf͚ںKujx[N[kzjeʔK \ tRJk.7Hɒ%o߾:WRQСC}ݧohk/%왃%TlYoʷ?ԟ,;C=uγaɁԩSޓ9s昣r -: ={V5jh :u \ A9zV0ڷo/;w\Kap]vp*FJ\%>>^yi?tEy% \ ,HgΜ1a$0Z(So9#F/"M4v I GТ#y_ l9Z0|k[uCZ/4ʹxK V7N{yӮ];Сyi`>?sV`iSO=eDߘg(.X]a+8bEʋ1GXVTXlL &.\σ"e驟srڗeM=(U^iY4s' \ z;a$/eչ#&@Nvf~(U Jԉ"'ω!~C^uăsd \ ;UN-lc,k 6b:v`Ύyn 8pU]Yb!0YЛǼau9Bø9K \ HL1i[z)Oyq2c!qʅC=?Vq3PɱŰ\!@N`E`5+0'pPr+Lʕ+a$(}U!ZbŊi6<2h \ ;..N';VV| (7 \ gj*sT~i+&-c'iL~<N Xy990_V\C=5r &2\˖-7I \ D"^2[mHf`"7ՌY1'yqmis0Q0'c9qŋm k1ch̗s'4`se[Ib|RrC=5$C)1$@$@$@pO" \ $@E'4˅" *:A$HHHB ,HHH " MTtB\+ \ LHHH 4 P raHHH@N 2 $@E'4˅" \ *:A$HHHB ,HHH " MTtB\+ \ LHHH 4 P raHHH@N 2 $@E'4˅" \ *:A$HHHB ,HHH " MTtB\+ \ LHHH 4 P raHHH@N 2 $@E'4˅" \ *:A$HHHB ,HHH " \ M>):o|'w6myK/Ijj=|ҤI:YfsٳgfO@lܸQz)7oYnj \ G @ `p+Vk \ FmW_j֬imk֬5m6l0pB[ɒ%mm+Og)~aulRW^m۶3jmKKK3c \ A bzR>9y(F~yu믿^u&ԿL"owwl @ IDATKRdԨQ:L)>ҷo_ٳgfߜ9st^+NFFTPAM&O֢Es2~+ʯL$@$@H \ `a'VUǎ СCFvM6ie7oA6l({Ā! \ GGGKuPt<eEYxz< J \ cǎa'I.4uTy8(4fPB?)))0t4u Zqnݺu \ \&<9rD,6l5GOll;w4Hip9ǁ:h<HHH \ 9[RQFj*x*U5I~ \ a)^xaܤ0\u9t$@$@$@y@@ΐ!C;IbbB;wO?TObNOO1c \ ۽{^ގIm۶ ?Ns̙rAiժe$@$@$@y?̘1C^u-[ٳgˀdѢERbEmu@֮]WluUʖ-+}xRD 9uL0A)? \ @!`<+01,5wvCIBB`YHHH \ d( @8p4CG \ A1 @h2r*[:Et[)%U Ԗx2fHH / \ K?e?vB~88$frILT4L \ \$@$@$NF3+dW$9#2(ne$@$@$ wTmV^,.6k[Sa_3 p2sj#Rr'ғ?gw> @ \ "}w#9gKq^84/VJĔq =6HS#%gKJFo'2 1NF \ H;"Y埓|EtXZ5[MRytCSӿɕ:8wSO&Mڅ i=! \ 0$9:aXh'fG;dTLYy?!\-=х/^R[ya7 \ ?_uNroR$x^FFI" -:X(Խ.قuƝmwuQt'f#XRLW{W \ Epb"t^Y*t^y/*K-C>>ԧ<nJ^#W)9D$@@N8RRb\ \ _jZ,qwp"ĸPLSU ֤~K~Kgg%`E*Jt\M$ \ wM+綻dPq@}.=ENRyxk=L)ϓ̜Ǿ6{ُ㣋JUDQ9olK \ N͑u6M$@aMNX_dR.]~rt,qfKU& ?`rgG6L \ δjd9W ֦)[VCQ-+JmH\%!mvsMc c &a]|y, d j;1 үcR?.ɇޕvJ*%d,:Ґ~~P"K$нҭt[]>I) \ ]A$@FNX[j;y0Qq.2V_[VЯy.$I+Aʒ%ieQae2Za:$e*MPՊ#a9c.W`ekz \ ˋK[J%!ZF l ?ו Y,ܬ`l&LoGRrp^lt.)$k \ %W̊)k]JrQ".>_QJˍy\>rqÏb\u)[2 \ *:9;_ s '6X"~gz=EvLG_˽ %)Ӻ8䖩$z֥'(_םI?3zisV}0q\O?}!&pWSZ R<# >*:_y*ؓ"ŕTUiS_t,z,cEP2'0)%F[\=>U/h$zҽ FxVZ`۞ʮJ-??PHr &ǯ;8y(νQ \ zjO=Ǒ9>ؽxJj? rm6.iČS \ 1;2?z4|.IH P(97m}Z(P_,=k@Nnap \ ysv$m7P9/?w{RPrb+f*@HYʪ #ux @6 \ p#/%Nr."jNQւ53LYG?; \ 6*qLI`ۡ}O:p3H4*:9B o/zm.VJ)]Kˑ<䥋l6ppYufb \ TyOƸb.cҳ&++Eh.e@* Va2y<H \ | P ߲O>;1!FUkNRu \ X5xv:v|z=I|Ŝkb JVve7sRj̏ȻSʆEñbJI͂zGHF% \ $L3Sieȶ[\w+_ \ (x՚3FPi[p;[ys2[cETSW*2}}JV"ACxw?rK$=dWj"0XU@,SXmfG32lJ8,P<=J(% \ t`Y|'s[_ RxEu&'㱉>zqK 3F" *:YsD![oNwVY3B$p:턲\e e}X{ǥbZ^ßc_YqY \ <Yzo0&.*:ԜL;KOVc2':OEd +['@c}5~.UmTos3&FV \ #^TtoNkvז%7'<`1 L Crϩ Ц?P0)$/N,wM"fdsB4D)EKy Rҹ \ LL\иVc)9%Lrwm:a8Fbs}zmg2I7LH ze z;.'G]G%'x*j9:hɜf(PEAX݆yiԫ8nC**:f <&l @E' \ 2IǧKbƅK Dy t$ g;vL PW`8O7|ܤp+g/o9+:kH \ { P^y2).EN^WI`:$)6+)uG^? W?K-8ɓsnsM' ,N,+7;]ҥmf/@{Jǖӟƅ7]M87v?lJZ-Kt3~ \ ]qk2 @z^# ]YZ)WٛI , M _,gVO=,8Aje]ӃH \ x*x,"02;,$J^>AʩH R`YSj0ڒ \ X^/d1s416ů;۱FNP245m}k'X6/VUxH \ ,>1[88:(rG e!3: Up82E`ɟ]Z@DXgiEPdK8%!#v \ e"$IkBP`r&uZRmH \ DGE=}r|HLqRQOwlWw/_xeRsO$ <a*kgF18Z ?=H \ @<9Ǧ9ؚlVj5aSL~=W+$s⣋^Uz:~?CqȰeȰ \ 0?Ti@$8v\V^$V \ 6LKIM9a"m\ؤp,T_[}Xjg$@2~?5Ogx6.`ANKZ'-x+Tzޜ^*HL`9wʾs;NW<V ? L ձ=̣$9#cBхGҺXWgy @< c w9oKB]=yd()&e?oceũ_,"[e5o$ P5 c \ >!SUvscALjEl?IS*HբG:[VVKiNOe)S 2I \ WK>r9\KJWbDGSlȲ8w9V*Z.)M+z ZpbL?pVx]ra \ 9ZH*:XO#v/S6:U@]y~ؤǜuj?n-*SL!Nt KQ+)}ZZc \ %TtRiQ<_/wGbM!O Y(F.R'lM \ vRE;wŔ@U^(l9*kyTr6JTzLRS3/$`U?l& \ 3t{k`2*:yߤ_:gx$dRt]"ZGξѲ_9Zv%a\wIl!7+տ/ $-O>` \ NGy ZY_]1\RhR˯jrch)/J(W9fTt\'wJ \ `dOnGʉџ" -lkz7oĻ뎹*)kFIU]6.Cf)gJ/IYH \ Q<WuSQ5U#ܶ~˱oVG@M# :Krq \ ]S̿2Z̓l&i\!jBQRS)JDGy / \ G.pڒe巓6]b" -#eV[9J}a75H*̈jA|3]7TP|+?JYL)A껊pQ +*{BWgmO|xeݏEI{ՋGLs{&=I pyyYCe/[AFT \ &eoʐ'WHfPB_-qn,/ ' Y͖V Rx`~^ERsԐ!r3x9~cGKv%znz$d *:QNKUy\1 \ ܓrU..{F~Dz1-$>6s 6g(9r%UtdBOB@bivx,> \ ,#㪨e]/5MANDcRJ$ȫ5&tלB1%Ugrk"q"4Nd \ V+:Ub`9o 2aP ׂOؙY gm),ԼH[]>)[2I \ \P |?K17U x&!\ \ ;^uyqJsu;N+G)=TOIWP"S9?fR (=&?VKU]46s \ 6^qc()yɲׂYnzۥ}^>wd2WvD!!/jLRz6xMj:^ %c(CI)q+R|j_f, r+2dgWE8IHf]rϨ;ˢTX6Zԏo0_$ vCsj+yUo_pR龿S7J^l \ g;tRYg)ˑ)%C+>ExvX,ZY&!/=S|J2|1֩s6Yv@dOM[/i6 \ R8{ZؕE&#[_T~5`$bP>?J!GEQ5~*CS唕hl>Ca CbaIR "b>?ym2{<p`(y3)=߭JqMREK9[n,s*qQzKp2Sґ@ \ &<z@W՟*3H:xRZpJ)45TRTeA/4Us \ wK1,@P"i:KPVd(CX.>C/˿sKJ? r>-{s}jEWD^NΚ~SYpb,SJrk \ 27I d P ٢}y-YtrCF_Khù[qG;|97("]YlaOQZ;)}٦?j_QdR{5'_lTr||>R"ɕzS,w/5xiVrs \ R*VVH P ͬO=,l#i6GS \ T~~emuQdaܜ92;t@0\Duzyqc`CšFI5:,ǦqmUa*n^XnwuT+ Uy+7=~'7?ΊJ%n{a7>'` \ ,ʼ*ʧś-dcv|o R;Q \ /8,S)B<<=\X_r<\6Ϳ ➮J \ %:^aT>RvF~7|=7]w\WC{C9KWCHNOG?ǧYM j[/w>$w.@(^d1sް%翾:a֨xVV:#>mԆfov KAJ?KI#MD4:z*$y7z l(WU~P :uAҊ+Pt`+qޅ2_<1tN}!r*^|]7ܜ1{K Ks8-'z-:K.#Gʞ={ytZI&ɸq$11Q:v(?ϟB'037СCe˖-r˫*5kQ \ i3S"}8jN4WU(gfLXYkӂ. P \ cL6!q*:le\ϼteY!PKmH;{Zg&^XqWЇr2ݍ꼼R^>[NB@aw6m]ʝw)Ӧeovm:Eeذa_ȂdY 30%%E:u$^zL>]+8]tt 3cΤTtpMRrӿ*9.|&pcW{ׯo;䓿z]}yXzPddK՞/t!C2NA꽕5&(^FB-[?w.vNw 1@֞Y. H G dсeݺu2ydY(ŋkNRdԨQ:l \ ҷo_m%039s/[nRBp>}cX-i?Mt,EcJ8[n[c$JS+貏 \ vGX>C.~aϐ%NMv)% 0SaFSHO;Lc \ 0l{/ݡVg#&mFW;L\x$"H Ν/,/XٶmlY \ dOaÆw^=hX|z! ?%::ZׯESXV~g]=HHTwh \ %6$!Q=@_\8˅*o;jdG#Kz(K7tk/kuZ^~@~M^o4yb \ ڢ$EͪN͈:0)eIA \ (M'B8[Oea=|}~_ts#n<{9zuXtz|NnW1CmP)!e#dU"& ;VɵEoEzIBM7gog~:ᣁJfT9rVh RKJJ 8̬ #M@VaF@/^iawbK$ZmrѶ|,NWjiS*7Ǯ?zw9h;[|<lu}ؚ#N&Ǘ> \ 61!|.tgLʁ-VڢՊh(ZRfRaQv?ǰhٗ/-%m`=4,騱z6z{ՋVIB{\o ڏ(iulPǖb+%#JU4'm*~:9QR!SwnQ,XGF-~':3a)Xv`1q@Ìp wpkݺu ygmr,,Y:呿q& \ z2e}3Lۯ6ٗ }JeYZq2 \ `Ij:&.0ǜyitj,/eVTFN?-2QYy̫v^o \ RVNR)Y+LzW,@@Ι3g[nr=/]tTTIap,2hӀ \ fg=6[=7\/8$f<&Ɇ]JÔ`/,v~aH5cp'r@eUd3:٤ WV \ aT{dpW<(CFhԏA[v(Z 7I}k#WnvW`-yd2r<KnHY)ܧ \ 7ĆrA"ЬSNI&MY|ԨQC:w,~<yR3f.аݻwQ۶mϟӜ9s<xPZje#[g3R\#bby njt9K V \ plNӻF^NmpGAO `/J>?Nwz8*H)RH \ "hޱXXJ" HG: \ pw\;w]~_x3<33O!zcw<q>&7V*B<Onv#]r}Z^g-͝G \ m)\wk>~Xȑޝ:uR[nE%596mmҥjwv 222hy4}tJMM% fϞM&LPm Aڗ.g^ӝG]gA%UdUZLiYK;O3ZKÒ @@<2oCx'yB m \ 1$%w[iXKL9>?RړMjydr@_8JAK6=ud-b/p6B[rss)--;) F۴HӧOS`m,=_*7r\ǐFЭ-[yo~C2QS@AB \ S#C~\jn<4O-̋y֛9๎Iї/7YPni#?פMTϊ5K(lJ \ Wg!'5w'_cah?~mvk 2W/YuX@.qBǸ4N<[Z \ #!6lE(.$% O \ x5ҜyrLnSIL~)ôXOt|b*zdS)Vy|v`KL; vN]o;B \ \Kr-</ y3ϟ5(ٞ=+_vop{nhr~RxB{h~a%2(E }0[ۈ@'W[BsX/<mʌko_us>mP{(LM-ϢC x8đ|ِZ)\ 5J~(;/ʩvyyh\<jmTEKFpϫ2 m<ƦO.ņ@ 9ZwJ5=|f:[yR7y(ݙ9SjE%ҸU:2atA & \ ?Z^ٙ,2Vj\hAqSHMilTZS(bQizSbXH:RΩY6)Y}<l̲ \ tA ' r-u| TW2 \ gH7zZ}/SF+E[b^ U$itC%=zpbzTWL\UKl \ :<ԏ@ 鱵|N/D~<YB=[W_gkބxLE] |'6PW|m*=?r4$2 \ ?rH_o;?;DGi#c+ma~(^|;_iw:Kz4iSx*~(drbc67͘@ \ !~<~V:QqȞ؟|_uyVk{o?~9ܐ(pt zֹnk6ɤDxj/ \ ,g*N;ۊ7]k5j=uul+:G<ȓ[B"]VE 9tNh)ȑ=<Iz0;5@sG_wQkYnt7ty|`+c UOV7mI3Z?CQ䌻tAlNnvՓQgJj \ Љ'}.sBo˘t}frxc5cW \ 1`BOҶ4r]ίjK|MnF}?[m<